2009-07-21 2 views
16

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

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

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

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

ответ

42

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], а затем отсортировать полученный массив.

+0

Спасибо, это сработало! Я сделал это, чтобы получить уникальные элементы в массиве: // добавить в набор для проверки уникальных имен элементов NSSet * uniqueNames = [NSSet setWithArray: names]; \t // возвращаем данные обратно в массив names = [[NSMutableArray alloc] initWithArray: [uniqueNames allObjects]]; – Rudi

+0

Более пустым способом вернуться к именам массивов будет: id names = [[uniqueNames allObjects] сохранить]; // если вы хотите сохранить имена или id names = [uniqueNames allObjects]; // если вы не хотите сохранять право собственности на массив –

+0

@BarryWark, не будет ли это O (n) для итерации? – Peres

3

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

+0

Спасибо за ответ Daniel! – Rudi

4

NSSet или NSMutableSet гарантирует, что у вас нет дубликатов объектов. Он будет работать для NSStrings, как в вашем примере, но для ваших собственных классов помните, что вы подразумеваете под «равным» и реализуете соответственно методы и isEqual:.

+0

Спасибо за объяснение, хорошо знать, что это автоматическое для NSStrings. – Rudi

1

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

NSSet *mySet = [NSSet setWithArray:myArray]; 

сейчас mySet будет иметь уникальные элементы.

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