Самый эффективный способ узнать, находится ли объект уже в NSMutableArray? - PullRequest
2 голосов
/ 28 апреля 2011

Я просто хочу знать, находится ли объект в массиве или нет.

Так что я могу использовать:

- (BOOL)containsObject:(id)anObj

Но он отправит -isEqual каждому объекту в массиве,Плохо, когда их тысячи.

А потом есть:

- (NSUInteger)indexOfObjectIdenticalTo:(id)anObject

, который, кажется, сравнивает только адреса памяти.Я думаю, что это быстрее.Но немного неприятно в использовании, конечно.Нужно проверить NSNotFound.

Является ли -indexOfObjectIdenticalTo лучшим вариантом?

Ответы [ 4 ]

2 голосов
/ 28 апреля 2011

если вам это действительно нужно часто, вы можете создать метод экземпляра по категории:

@interface NSArray (MONStuff)
- (BOOL)mon_containsObject:(id)object;
@end


@implementation NSArray (MONStuff)

- (BOOL)mon_containsObject:(id)object {
  return NSNotFound != [self indexOfObjectIdenticalTo:arg];
}

@end

или это также CFArrayContainsValue.

простой функции также будет достаточно.

2 голосов
/ 28 апреля 2011

Но немного неприятно использовать

Почему? Мне кажется, что

if ([array indexOfObjectIdenticalTo: foo] != NSNotFound)
{
    // do what you need
}

не намного противнее

if ([array containsObject: foo])
{
    // do what you need
}

Какой из них вы выберете, зависит от того, какую семантику равенства вы используете. Вы почти наверняка захотите использовать -containsObject: для массивов, содержащих NSString s или NSNumber s, потому что -isEqual: дает правильную семантику равенства.

Между прочим, оба метода: O (n) , и именно в этом проблема реальной производительности. Если идея линейного поиска является проблемой, рассмотрим другую структуру данных, например, основано на NSDictionary.

1 голос
/ 28 апреля 2011

Если возможно (например, если порядок сортировки не имеет значения), вы можете вместо этого использовать NSDictionary с вашим объектом в качестве ключей и значениями [NSNull null].Обратите внимание, что объекты копируются при использовании в качестве ключей!Ваши объекты должны будут реализовать метод - (NSUInteger)hash.

Также смотрите превосходный анализ NSArray или NSSet, NSDictionary или NSMapTable от Мэтта Галлахера.

1 голос
/ 28 апреля 2011

В соответствии с вашими объяснениями и сравнением indexOfObjectIdenticalTo кажется мне первым выбором для использования ..

Вот еще один SO пост.*

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...