2013-06-05 4 views
0

Я работаю в Objective-C/Cocoa, и у меня есть тип объекта Tile. Каждый из них имеет подпись, которая может быть представлена ​​как 4 различных целочисленных значения. Если я вывожу несколько этих значений в виде строки, с - эс отделяя значения, это выглядит как в этом примере:Как хранить и сравнивать 4 значения для нескольких экземпляров одного и того же типа объекта?

signature: 4-4-3-3 
signature: 4-3-3-3 
signature: 0-0-0-1 
signature: 0-0-1-1 
signature: 0-0-1-0 
signature: 1-1-1-2 
signature: 1-1-2-2 
signature: 1-1-2-1 
signature: 3-3-3-1 
signature: 3-3-1-1 
signature: 3-3-1-3 
signature: 4-4-4-3 
signature: 4-4-3-3 

Я в настоящее время хранения каждого из значений в качестве unsigned short. Никогда не будет отрицательных значений, и максимальное значение вряд ли будет выше 15 или около того. Значение Zero является допустимым. Нет значения «ноль».

Я хотел бы быть в состоянии назвать:

[myTile signature] для получения значения.

[myTile matches:otherTile], чтобы вернуть BOOL, указав, соответствуют ли подписи.

Каков наиболее эффективный способ хранения этой «подписи» и сравнить ее с подписями других Tile экземпляров? Кажется, что сравнение строк будет медленным ...

ответ

3

Прежде всего, я бы использовал используемые имена методов для этих задач: description и isEqual*:.

Что касается Вашего вопроса, я думаю, что лучший способ проще:

- (BOOL)isEqualToTile:(Tile)tile 
{ 
    return self.value1 == tile.value1 && 
      self.value2 == tile.value2 && 
      self.value3 == tile.value3 && 
      self.value4 == tile.value4; 
} 

Другая возможность может быть реализовать hash.

EDIT: Я бы не стал слишком беспокоиться о производительности, если бы был вами.

  • Поскольку 8 сравнений бывают быстрыми. Я имею в виду действительно быстро. Если бы вы собрали небольшой ориентир, вы бы обнаружили, что для каждого сравнения требуется ~ 1.5E-8s для запуска. Это не говорит со мной много, но позволяет просто сказать, что вы можете сделать 10 000 000 из этих сравнений менее 100 мс, если моя математика верна.
  • Потому что, если однажды вы обнаружите, что ваше программное обеспечение медленно, тогда пришло время исследовать происхождение этой медлительности (и я сомневаюсь, что это исходит из этого метода), но помните, что premature optimization is the root of all evil.
  • Поскольку вам потребовалось 12 секунд, чтобы реализовать его, и, вероятно, потребуется немного больше, чтобы подумать о работе hash. Не переусердствуйте. См. Мой второй пункт.
  • Потому что, если вам нужен один день для оптимизации этой функции (если вы делаете это сейчас, перечитайте мою вторую точку), у Cocoa есть несколько удобных инструментов, чтобы сделать ваше программное обеспечение таким тупым и повторяющимся. Не царапая голову, чтобы сделать ее быстрее только на одном из ваших (постоянно растущих) сердечников.
+0

Будет ли один из этих подходов иметь лучшую производительность, чем другая? Мне, вероятно, потребуется перебирать большое количество этих объектов, выполнять сравнения и делать это быстро. – Clay

+0

См. Мое редактирование. tl; dr: не беспокойтесь об этом, [KISS] (http://en.wikipedia.org/wiki/KISS_principle). –

+1

Примечание: если вы реализуете 'isEqualToTile:' вы также должны реализовать 'isEqual:' (принимает 'NSObject', проверяем, что это' Tile', возвращаем 'NO', если нет, иначе возвращаем' isEqualToTile: ') * и *' hash'. Если вы не выполняете эти части фреймворка, например. коллекции, будут разбиты, если вы используете их с плитками. – CRD

Смежные вопросы