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



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



мой вопрос:



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

584   11  

11 ответов:

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

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

изображения документация 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 - это distinct (без повторов), ненумерованный список элементов

[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]

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

enter image description here

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

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

NSSet

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

NSArray

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

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

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

NSArray:

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

NSSet:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

короче выводы:

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

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

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

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

Comments

    Ничего не найдено.