Сделайте уникальный NSMutableArray или NSMutableSet - PullRequest
16 голосов
/ 21 июля 2009

Я в настоящее время перечисляю элементы NSMutableArray (или NSMutableSet), чтобы найти дубликаты и удалить их.

Например, если массив / набор имеет значения [@"a", @"b", @"b", @"c"], конечный результат должен быть [@"a", @"b", @"c"].

Поскольку я сравниваю NSStrings, я использую метод isEqualTo:, чтобы проверить, равны ли строки.

Есть ли более эффективный способ удалить дубликаты записей, чем циклически просматривать все из них и проверять, существует ли дубликат?

Ответы [ 4 ]

42 голосов
/ 21 июля 2009

NSSet делает именно то, что вы пытаетесь сделать: это (неупорядоченный) набор уникальных предметов. Таким образом, вы можете найти уникальные элементы в вашем массиве следующим образом:

NSSet *uniqueElements = [NSSet setWithArray:myArray];

// iterate over the unique items
for(id element in uniqueElements) {
  // do something
}

NSSet, скорее всего, использует алгоритм хеширования, чтобы сделать вставку O (1) (по сравнению с O (n ^ 2), чтобы проверить, является ли каждый элемент уникальным итерацией), но документация Apple не дает такой гарантии Вы, вероятно, не должны рассчитывать на эту деталь реализации.

Если по какой-то причине вам необходимо сохранить уникальные элементы в отсортированной (упорядоченной) коллекции, вы можете превратить набор обратно в массив с помощью -[NSSet allObjects], а затем отсортировать полученный массив.

4 голосов
/ 22 июля 2009

NSSet или NSMutableSet гарантируют, что у вас нет повторяющихся объектов. Это будет работать для NSStrings, как в вашем примере, но для ваших собственных классов имейте в виду, что вы подразумеваете под "равным", и реализуйте методы hash и isEqual: соответственно.

3 голосов
/ 21 июля 2009

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

1 голос
/ 09 апреля 2013

Только эта строка кода будет работать нормально.

NSSet *mySet = [NSSet setWithArray:myArray];

теперь в mySet будут уникальные элементы.

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