Подтвердить что ты не робот

Создайте уникальный NSMutableArray или NSMutableSet

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

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

NSSet *mySet = [NSSet setWithArray:myArray];

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