Я много раз использовал NSSets в своих приложениях, но сам никогда не создавал их.
ios
objective-c
arrays
cocoa
cocoa-touch
geminiCoder
источник
источник
Изображение из документации Apple очень хорошо описывает это:
Array
приведен упорядоченный (порядок сохраняется при добавлении) последовательность элементовSet
это отдельный (без дубликатов) неупорядоченный список элементовисточник
Лучший ответ - собственная документация Apple .
Основное различие заключается в том, что оно
NSArray
предназначено для упорядоченной коллекции иNSSet
для неупорядоченной коллекции.Есть несколько статей, в которых говорится о разнице в скорости между ними, как эта . Если вы перебираете неупорядоченную коллекцию,
NSSet
отлично. Однако во многих случаях вам нужно делать то, что толькоNSArray
может, поэтому вы жертвуете скоростью ради этих способностей.NSSet
NSArray
Вот и все, что нужно сделать! Сообщите мне, если это поможет.
источник
NSSet
ради индексации. Обычно для одних и тех же данных используются две разные структуры данных. Или вы создаете и индексируете этот массив :) Но тогда лучше использовать БД, в которой он уже реализован.NSSet
иNSArray
, мой ответ точный и полный. Да, вы можете создавать другие структуры данных, но я просто сравниваю эти две.NSArray
и некоторая функциональностьNSSet
, правильный ответ - не «использоватьNSArray
и жертвовать производительностью». Ответ - объединить оба или использовать другую структуру данных.NSOrderedSet доступен в iOS 5+, поэтому основное различие заключается в том, хотите ли вы дублировать объекты в структуре данных.
источник
NSArray :
NSSet :
источник
Массив используется для доступа к элементам по их индексу. Любой элемент можно вставить в массив несколько раз. Массивы сохраняют порядок своих элементов.
Набор используется в основном только для проверки, находится ли элемент в коллекции или нет. Элементы не имеют понятия порядка или индексации. Вы не можете иметь предмет в наборе дважды.
Если массив хочет проверить, содержит ли он элемент, он должен проверить все его элементы. Наборы предназначены для использования более быстрых алгоритмов.
Вы можете представить себе набор как словарь без значений.
Обратите внимание, что массив и набор - не единственные структуры данных. Есть и другие, например, очередь, стек, куча, куча Фибоначчи. Я бы рекомендовал прочитать книгу об алгоритмах и структурах данных.
См. Википедию для получения дополнительной информации.
источник
contains
операцииO(n)
. Количество сравнений, когда нет в массивеn
. Среднее количество сравнений, когда объект находится в массиве, составляетn/2
. Даже если объект найден, производительность ужасная.NSArray
s есть другие преимущества в скорости передNSSet
s. Как всегда, это компромисс.массив
набор
источник
Основные отличия уже были приведены в других ответах.
Я просто хотел бы отметить, что из-за способа реализации наборов и словарей (т. Е. С использованием хэшей) следует быть осторожным, чтобы не использовать изменяемые объекты для ключей.
Если ключ изменен, то хеш (возможно) тоже изменится, указывая на другой индекс / сегмент в хеш-таблице. Исходное значение не будет удалено и будет фактически учтено при перечислении или запросе структуры для ее размера / количества.
Это может привести к тому, что некоторые ошибки действительно сложно будет найти.
источник
Здесь вы можете найти довольно подробное сравнение структур данных
NSArray
иNSSet
.Краткие выводы:
источник
Обычно вы используете Set, когда скорость доступа имеет существенное значение, а порядок не имеет значения или определяется другими способами (через предикат или дескриптор сортировки). Core Data, например, использует наборы, когда доступ к управляемым объектам осуществляется через отношение ко многим.
источник
Просто чтобы добавить немного, я иногда использую set, чтобы удалить дубликаты из массива, например: -
источник