Эликсир - Списки и кортежи

(Связанные) списки

Связанный список - это разнородный список элементов, которые хранятся в разных местах в памяти и отслеживаются с помощью ссылок. Связанные списки - это структуры данных, особенно используемые в функциональном программировании.

В Elixir для указания списка значений используются квадратные скобки. Ценности могут быть любого типа -

[1, 2, true, 3]

Когда Elixir видит список печатаемых номеров ASCII, Elixir напечатает его как список символов (буквально список символов). Всякий раз, когда вы видите значение в IEx и не знаете, что это такое, вы можете использоватьi функция для получения информации о нем.

IO.puts([104, 101, 108, 108, 111])

Все вышеперечисленные символы в списке можно распечатать. Когда вышеуказанная программа запускается, она дает следующий результат -

hello

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

IO.puts(is_list('Hello'))

Когда вышеуказанная программа запускается, она дает следующий результат -

true

Имейте в виду, что представления в одинарных и двойных кавычках не эквивалентны в Elixir, поскольку они представлены разными типами.

Длина списка

Чтобы найти длину списка, мы используем функцию длины, как в следующей программе -

IO.puts(length([1, 2, :true, "str"]))

Вышеупомянутая программа генерирует следующий результат -

4

Конкатенация и вычитание

Два списка можно объединить и вычесть с помощью ++ и --операторы. Рассмотрим следующий пример, чтобы понять функции.

IO.puts([1, 2, 3] ++ [4, 5, 6])
IO.puts([1, true, 2, false, 3, true] -- [true, false])

Это даст вам объединенную строку в первом случае и вычтенную строку во втором. Вышеупомянутая программа генерирует следующий результат -

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

Начало и конец списка

Голова - это первый элемент списка, а хвост - оставшаяся часть списка. Их можно получить с помощью функцийhd и tl. Давайте присвоим переменной список и получим его заголовок и хвост.

list = [1, 2, 3]
IO.puts(hd(list))
IO.puts(tl(list))

Это даст нам начало и конец списка в качестве вывода. Вышеупомянутая программа генерирует следующий результат -

1
[2, 3]

Note - Получение начала или конца пустого списка - ошибка.

Другие функции списка

Стандартная библиотека Elixir предоставляет множество функций для работы со списками. Мы рассмотрим некоторые из них здесь. Вы можете ознакомиться с остальными здесь Список .

S.no. Название и описание функции
1

delete(list, item)

Удаляет данный элемент из списка. Возвращает список без элемента. Если элемент встречается в списке более одного раза, удаляется только первое вхождение.

2

delete_at(list, index)

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

3

first(list)

Возвращает первый элемент в списке или ноль, если список пуст.

4

flatten(list)

Сглаживает данный список вложенных списков.

5

insert_at(list, index, value)

Возвращает список со значением, вставленным по указанному индексу. Обратите внимание, что индекс ограничен длиной списка. Отрицательные индексы указывают смещение от конца списка.

6

last(list)

Возвращает последний элемент в списке или ноль, если список пуст.

Кортежи

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

В Elixir для определения кортежей используются фигурные скобки. Как и списки, кортежи могут содержать любое значение -

{:ok, "hello"}

Длина кортежа

Чтобы получить длину кортежа, используйте tuple_size работают как в следующей программе -

IO.puts(tuple_size({:ok, "hello"}))

Вышеупомянутая программа генерирует следующий результат -

2

Добавление значения

Чтобы добавить значение в кортеж, используйте функцию Tuple.append -

tuple = {:ok, "Hello"}
Tuple.append(tuple, :world)

Это создаст и вернет новый кортеж: {: ok, "Hello",: world}

Вставка значения

Чтобы вставить значение в заданную позицию, мы можем использовать Tuple.insert_at функция или put_elemфункция. Рассмотрим следующий пример, чтобы понять то же самое -

tuple = {:bar, :baz}
new_tuple_1 = Tuple.insert_at(tuple, 0, :foo)
new_tuple_2 = put_elem(tuple, 1, :foobar)

Заметить, что put_elem и insert_atвернул новые кортежи. Исходный кортеж, хранящийся в переменной кортежа, не был изменен, поскольку типы данных Elixir неизменяемы. Поскольку код на Elixir неизменен, его легче рассуждать, так как вам не нужно беспокоиться, если конкретный код изменяет вашу структуру данных на месте.

Кортежи против списков

В чем разница между списками и кортежами?

Списки хранятся в памяти как связанные списки, что означает, что каждый элемент в списке содержит свое значение и указывает на следующий элемент до тех пор, пока не будет достигнут конец списка. Каждую пару значений и указателей мы называем cons-ячейкой. Это означает, что доступ к длине списка является линейной операцией: нам нужно пройти весь список, чтобы определить его размер. Обновление списка происходит быстро, пока мы добавляем элементы.

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