сохранить уникальный идентификатор объекта в NSMutableArray - PullRequest
0 голосов
/ 10 июня 2019

У меня есть NSMutableArray, который содержит отсортированные (по времени) объекты.каждый объект имеет уникальный идентификатор строки URL-адреса.

Какой подход лучше с точки зрения производительности?

  1. с использованием FilterArrayUsingPredicate, чтобы проверить, существует ли уже URL-адрес объекта, если его не добавить в массив.
  2. с использованием NSMutableDictionary и NSMutableArray.каждый раз, когда я добавляю объект, который не существует, я также сохраняю его в словаре.перед добавлением нового объекта я проверю ключ NSDictionary, если идентификатор объекта существует.

Я думаю, что использование NSDictionary для проверки дешевле, но я предпочитаю понять, почему.

Есть ли лучший подход для этого случая?Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 10 июня 2019

Рассматривали ли вы использовать NSMutableSet для сохранения уникального идентификатора строки URL-адреса?

Поскольку вы уже храните объекты в отсортированном массиве, вам не нужно снова сохранять их в словаре. Просто держите строку в наборе. Проверка наборов с помощью «содержит» очень быстро. Скорость «содержит» в наборе должна быть почти постоянной, независимо от того, сколько предметов она содержит.

Вы также можете рассмотреть возможность переключения на NSMutableOrderedSet вместо массива вообще. Он будет сохранять элементы уникальными и отсортированными.

Подробнее о производительности класса Collection можно узнать здесь https://www.objc.io/issues/7-foundation/collections/

0 голосов
/ 10 июня 2019

Я могу рекомендовать использовать NSOrderedSet (если вам нужен заказ) или NSSet (в противном случае) :

NSOrderedSet *orderedSet = [NSOrderedSet orderedSetWithArray:yourArray];
NSArray *arrayWithoutDuplicates = [orderedSet array];

Или вы можете использовать операторы из KeyValueCording:

uniquearray = [yourarray valueForKeyPath:@"@distinctUnionOfObjects.self"];

Если вы хотите удалить дубликаты своей собственностью, например name, это действительно просто с помощью этого оператора:

@distinctUnionOfObjects.name

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

Итак, вы можете прочитать о коллекциях какао в Apple Docs

Если вы хотите вставить уникальный объект в массив, это будет стоить O (1) -O (N) , но если вы хотите вставить уникальный объект в Set, это будет стоить 0 (1) , мгновенно . Подробнее о сложности здесь

В этом случае установить быстрее, чем массив.

...