Создайте уникальный NSMutableArray или NSMutableSet
В настоящее время я перечисляю элементы NSMutableArray
(или NSMutableSet
), чтобы найти дубликаты и удалить их.
Например, если массив/набор имеет значения [@"a", @"b", @"b", @"c"]
, конечный результат должен быть [@"a", @"b", @"c"]
.
Поскольку я сравниваю NSStrings
, я использую метод isEqualTo:
для проверки того, являются ли строки равными.
Существует ли более эффективный способ удаления дубликатов записей, чем для их прокрутки и проверки наличия дубликата?
Ответы
Ответ 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 будет иметь уникальные элементы.