it-swarm.com.ru

Когда лучше использовать NSSet поверх NSArray?

Я много раз использовал NSSets в своих приложениях, но сам никогда не создавал их.

Когда лучше использовать NSSet , а не NSArray и почему?

110
geminiCoder

Когда порядок элементов в коллекции не важен, наборы предлагают лучшую производительность для поиска элементов в коллекции.

Причина в том, что набор использует хеш-значения для поиска элементов (например, словарь), в то время как массив должен перебирать все свое содержимое, чтобы найти конкретный объект.

166
Ole Begemann

Изображение из Документация Apple очень хорошо описывает это:

Objective-C Collections

Array - это упорядоченная (порядок сохраняется при добавлении) последовательности элементов

[array addObject:@1];
[array addObject:@2];
[array addObject:@3];
[array addObject:@4];
[array addObject:@6];
[array addObject:@4];
[array addObject:@1];
[array addObject:@2];

[1, 2, 3, 4, 6, 4, 1, 2]

Set - это отдельный (без дубликатов), неупорядоченный список элементов

[set addObject:@1];
[set addObject:@2];
[set addObject:@3];
[set addObject:@4];
[set addObject:@6];
[set addObject:@4];
[set addObject:@1];
[set addObject:@2];

[1, 2, 6, 4, 3]
177
James Webster

Лучший ответ на это собственная документация Apple .

enter image description here

Основное отличие состоит в том, что NSArray для упорядоченной коллекции, а NSSet для неупорядоченной коллекции.

Есть несколько статей, в которых говорится о разнице в скорости между ними, например эта . Если вы перебираете неупорядоченную коллекцию, NSSet отлично подходит. Однако во многих случаях вам нужно делать то, что может делать только NSArray, поэтому вы жертвуете скоростью для этих способностей.

NSSet

  • В первую очередь доступ к элементам для сравнения
  • Неупорядоченный
  • Не позволяет дубликаты

NSArray

  • Может получить доступ к элементам по индексу
  • Приказал
  • Позволяет дубликаты

Вот и все, что нужно сделать! Дайте мне знать, если это поможет.

65
woz

NSOrderedSet доступен в iOS 5+, поэтому основное отличие состоит в том, хотите ли вы дублировать объекты в структуре данных.

12
Jason

NSArray:

  1. Упорядоченный сбор данных
  2. Позволяет дубликаты
  3. Это объект типа коллекции

NSSet:

  1. Неупорядоченный сбор данных
  2. Не позволяет дубликаты
  3. Это также объект типа коллекции
9
iOS Lifee

Массив используется для доступа к элементам по их индексу. Любой элемент может быть вставлен в массив несколько раз. Массивы поддерживают порядок своих элементов.

Набор используется в основном только для проверки, находится ли элемент в коллекции или нет. Предметы не имеют понятия порядка или индексации. Вы не можете иметь предмет в наборе дважды.

Если массив хочет проверить, содержит ли он элемент, он должен проверить все его элементы. Наборы предназначены для использования более быстрых алгоритмов.

Вы можете представить набор как словарь без значений.

Обратите внимание, что массив и набор - не единственные структуры данных. Есть и другие, например Очередь, Стек, Куча, Куча Фибоначчи. Я бы порекомендовал прочитать книгу об алгоритмах и структурах данных.

Смотрите Википедия для получения дополнительной информации.

7
Sulthan
NSArray *Arr;
NSSet *Nset;

Arr=[NSArray arrayWithObjects:@"1",@"2",@"3",@"4",@"2",@"1", nil];
Nset=[NSSet setWithObjects:@"1",@"2",@"3",@"3",@"5",@"5", nil];

NSLog(@"%@",Arr);
NSLog(@"%@",Nset);

массив

2015-12-04 11: 05: 40.935 [598: 15730] (1, 2, 3, 4, 2, 1)

набор

2015-12-04 11: 05: 43.362 [598: 15730] {(3, 1, 2, 5)}

5
abc221

Основные отличия уже были даны в других ответах.

Хотелось бы только отметить, что из-за того, как реализованы наборы и словари (т. Е. С использованием хэшей), следует соблюдать осторожность, чтобы не использовать изменяемые объекты для ключей.

Если ключ видоизменен, то хеш (вероятно) тоже изменится, указывая на другой индекс/сегмент в хеш-таблице. Исходное значение не будет удалено и будет фактически учтено при перечислении или запросе структуры для ее размера/количества.

Это может привести к некоторым действительно трудно найти ошибки.

4
joakim

Здесь вы можете найти довольно тщательное сравнение структур данных NSArray и NSSet.

Краткие выводы:

Да, NSArray быстрее, чем NSSet, просто удерживает и выполняет итерации. На 50% быстрее для построения и на 500% быстрее для итерации. Урок: если вам нужно только перебрать содержимое, не используйте NSSet.

Конечно, если вам нужно проверить включение, старайтесь избегать NSArray. Даже если вам нужно итеративное тестирование, и тестирование на включение, вам все равно стоит выбрать NSSet. Если вам нужно упорядочить свою коллекцию, а также проверить ее на включение, вам следует рассмотреть возможность сохранения двух коллекций (NSArray и NSSet), каждая из которых содержит одинаковые объекты.

NSDictionary создается медленнее, чем NSMapTable - поскольку ему необходимо скопировать данные ключа. Это компенсирует это быстрым поиском. Конечно, оба имеют разные возможности, поэтому большую часть времени это решение должно приниматься по другим факторам.

3
Che

Обычно вы используете Устанавливается, когда скорость доступа важна, а порядок не имеет значения или определяется другими средствами (с помощью предиката или дескриптора сортировки). Базовые данные, например, используют наборы, когда к управляемым объектам обращаются через отношение ко многим

2
iDevAmit

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

NSMutableSet *set=[[NSMutableSet alloc]initWithArray:duplicateValueArray]; // will remove all the duplicate values
1
dreamBegin