Когда лучше использовать NSS для NSArray?

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

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

Ответ 1

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

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

Ответ 2

Изображение из документации 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]

Ответ 3

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

enter image description here

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

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

NSSet

  • Первично доступ к элементам сравнения
  • Unordered
  • Не разрешает дубликаты

NSArray

  • Доступ к элементам по индексу
  • Заказал
  • Позволяет дублировать

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

Ответ 4

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

Ответ 5

NSArray

  • Упорядоченный сбор данных
  • Позволяет дублировать
  • Объект типа коллекции

NSSet

  • Неупорядоченный сбор данных
  • Не разрешает дубликаты
  • Это также объект типа коллекции

Ответ 6

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

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

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

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

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

Подробнее см. wikipedia.

Ответ 7

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)}

Ответ 8

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

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

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

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

Ответ 9

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

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

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

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

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

Ответ 10

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

Ответ 11

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

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