Проверьте дубликаты строк NSS на массиве NSMutableArray - PullRequest
0 голосов
/ 07 ноября 2010

Я получил NSMutableArray, к которому я хочу добавить строки. Мне нужно проверить, существует ли эта строка в массиве, прежде чем добавить эту строку в него. В любом случае знает, как это сделать?

Спасибо!

Ответы [ 3 ]

8 голосов
/ 07 ноября 2010

Если порядок не имеет значения, самый простой способ - перейти на использование NSMutableSet. Наборы неупорядочены, и NSSets и NSMutableSets могут содержать каждый объект только один раз. Только подсчитанный набор (NSCountingSet) может содержать один и тот же объект несколько раз.

Если порядок имеет значение, продолжайте использовать NSMutableArray и используйте -containsObject:, чтобы проверить, что объекта еще нет, прежде чем добавить его.


Редактировать: И теперь у Lion NSOrderedSet и NSMutableOrderedSet! Шоколад в моем арахисовом масле! Арахисовое масло в моем шоколаде!

Как и неупорядоченный набор, вы получаете быстрое тестирование членства, запрет дубликатов и, конечно, операции набора (объединение, пересечение и т. Д.). Как и массив, вы получаете упорядоченный доступ, включая перечисление надежного порядка и доступ по индексу.

Итак, если вам нужно отклонить дубликаты, но в то же время сохранить порядок, классы Lion NS {, Mutable} OrderedSet для вас.

1 голос
/ 07 ноября 2010

Если вы просто хотите сделать то, что вы указали один раз, просто используйте containsObject:, как в

if (![myArray containsObject:theObject]) [myArray addObject:theObject];

Обратите внимание, что при этом выполняется линейный поиск в массиве, и поэтому он не подходит, если вы собираетесь часто использовать эту операцию. Если да, и вам не нужно заказывать, вы должны использовать NSSet. Если вам нужно упорядочить, вы можете использовать как NSArray, так и NSSet, которые синхронизированы (например, всегда добавляйте / удаляйте один и тот же объект из обеих коллекций одновременно).

0 голосов
/ 08 октября 2013

Я предпочел предикат NSP, который описан здесь

Короче

NSMutableArray *array = [NSMutableArray arrayWithObjects:@"Nick", @"Ben", @"Adam", @"Melissa", nil];

NSPredicate *bPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES[c] %@", your_search_key];
NSArray *beginWithB = [array filteredArrayUsingPredicate:bPredicate];

if ([beginWithB count] > 0)
{
    //Handle duplicate
}
...