Разница между массивом, множеством и словарем в Swift
Я новичок в Swift Lang, видел много уроков, но не ясно - мой вопрос, в чем главное отличие Array
, Set
а также Dictionary
тип коллекции?
4 ответа
Вот практические различия между различными типами:
Массивы являются эффективно упорядоченными списками и используются для хранения списков информации в тех случаях, когда порядок важен.
Например, сообщения в приложении социальной сети, отображаемые в tableView, могут храниться в массиве.
Наборы различны в том смысле, что порядок не имеет значения, и они будут использоваться в тех случаях, когда порядок не имеет значения.
Наборы особенно полезны, когда вам нужно убедиться, что элемент появляется только один раз в наборе.
Словари используются для хранения ключей, пар значений и используются, когда вы хотите легко найти значение по ключу, как в словаре.
Например, вы можете хранить список элементов и ссылки на дополнительную информацию об этих элементах в словаре.
Надеюсь это поможет:)
(Для получения дополнительной информации и поиска собственных определений Apple ознакомьтесь с руководствами Apple по адресу https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/CollectionTypes.html).
Подробную документацию можно найти здесь, в руководстве Apple. Ниже приведены несколько быстрых определений:
массив
Массив хранит значения того же типа в упорядоченном списке. Одно и то же значение может появляться в массиве несколько раз в разных позициях.
Задавать
Набор хранит различные значения одного и того же типа в коллекции без определенного порядка. Вы можете использовать набор вместо массива, когда порядок элементов не важен или когда вам нужно убедиться, что элемент появляется только один раз.
толковый словарь
В словаре хранятся ассоциации между ключами одного типа и значениями одного и того же типа в коллекции без определенного порядка. Каждое значение связано с уникальным ключом, который действует как идентификатор для этого значения в словаре. В отличие от элементов в массиве, элементы в словаре не имеют определенного порядка. Вы используете словарь, когда вам нужно искать значения на основе их идентификатора, во многом так же, как в реальном словаре используется для поиска определения для конкретного слова.
Старый поток еще стоит поговорить о производительности.
С данным N элементом внутри массива или словаря стоит учитывать производительность, когда вы пытаетесь получить доступ к элементам или добавить или удалить объекты.
Массивы
Доступ к случайному элементу будет стоить вам столько же, сколько и доступ к первому или последнему, поскольку элементы следуют последовательно друг за другом, поэтому к ним осуществляется прямой доступ. Они будут стоить вам 1 цикл.
Вставка элемента является дорогостоящей. Если вы добавите в начало, это будет стоить вам 1 цикл. Вставляя в середину, остаток нужно сместить. В худшем случае это может стоить столько же, сколько N циклов (в среднем N/2 циклов). Если вы добавите в конец и у вас будет достаточно места в массиве, это будет стоить вам 1 цикл. В противном случае будет скопирован весь массив, что обойдется вам в N цикл. Вот почему так важно выделить достаточно места для массива в начале операции.
Удаление с начала или до конца обойдется вам 1. С середины смены требуется операция. В среднем это N/2.
Поиск элемента с данным свойством обойдется вам в N/2 цикл.
Так что будьте очень осторожны с огромными массивами.
Словари
Хотя словари не работают, они могут принести вам некоторые преимущества. Поскольку ключи хешируются и хранятся в хеш-таблице, любая операция обойдется вам в 1 цикл. Единственным исключением может быть нахождение элемента с заданным свойством. В худшем случае это может стоить вам цикла N/2. Однако при умном дизайне вы можете назначать значения свойств в качестве ключей словаря, поэтому поиск обойдется вам всего в 1 цикл независимо от того, сколько элементов находится внутри.
Коллекции Swift — массив, словарь, набор
Каждая коллекция является динамической, поэтому у нее есть дополнительные шаги для расширения и свертывания. Массив должен выделять больше памяти и копировать старую дату в новую, Словарь дополнительно должен пересчитывать индексы корзины для каждого объекта внутри
Array — ArrayList — динамический массив объектов. Он основан на обычном массиве. Используется для задачи, где вам очень часто нужно иметь доступ по индексу
get by index - O(1)
find element - O(n) - you try to find the latest element
insert/delete - O(n) - every time a tail of array is copied/pasted
Словарь - HashTable, HashMap - сохранение пар ключ/значение. Он содержит ведра/корзины (структура массива, доступ по индексу), где каждая из них содержит другую структуру (список массивов, связанный список, дерево). Столкновения решаются
- рассчитать хэш -код ключа [О программе] (
) и на основе этого хеш-кода вычисляется индекс ведра (например, с помощью модуля (mod)). - Поскольку функция Hashable возвращает
он не может гарантировать, что два разных объекта будут иметь разные хеш-коды. При этом пересчет корзины не равен Int.max. Когда у нас есть два разных объекта с одинаковыми хеш-кодами, или ситуация, когда два объекта с разными хэш-кодами лежат в одной корзине - это коллизия. Вот почему, когда мы знаем индекс корзины, мы должны проверить, есть ли там кто-нибудь такой же, как наш ключ , и идет на помощь. Если два объекта равны, объект ключ/значение будет заменен, в противном случае - внутри будет добавлен новый объект ключ/значение
find element - O(1) to O(n)
insert/delete - O(1) to O(n)
O(n) - в случае, когда хэш-код для всех объектов один и тот же, поэтому у нас всего одно ведро. Таким образом, хеш-функция должна равномерно распределять элементы
Как видите, HashMap не поддерживает доступ по индексу, но в других случаях работает лучше.
Set - хэш Set. Основан на HashTable, где не используйте значение