Учебники

Эликсир — списки и кортежи

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

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

[1, 2, true, 3]

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

Live Demo

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

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

hello

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

Live Demo

IO.puts(is_list('Hello'))

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

true

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

Длина списка

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

Live Demo

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]

Примечание. Получение заголовка или хвоста пустого списка является ошибкой.

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

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

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

удалить (список, элемент)

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

2

delete_at (список, индекс)

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

3

первый (список)

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

4

расплющить (список)

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

5

insert_at (список, индекс, значение)

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

6

последний (список)

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

удалить (список, элемент)

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

delete_at (список, индекс)

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

первый (список)

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

расплющить (список)

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

insert_at (список, индекс, значение)

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

последний (список)

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

Кортеж

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

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

{:ok, "hello"}

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

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

Live Demo

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. Это означает, что доступ к длине списка является линейной операцией: нам нужно просмотреть весь список, чтобы выяснить его размер. Обновление списка происходит быстро, пока мы добавляем элементы.

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