📜  Elixir-列表和元组

📅  最后修改于: 2020-11-04 05:26:40             🧑  作者: Mango


(链接的)列表

链表是元素的异构列表,这些元素存储在内存中的不同位置,并通过使用引用进行跟踪。链接列表是特别用于功能编程的数据结构。

Elixir使用方括号指定值列表。值可以是任何类型-

[1, 2, true, 3]

当药剂看到打印的ASCII号码列表,药剂将打印的字符表(实际上是一种字符的列表)。每当您在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]

清单的头和尾

头部是列表的第一个元素,而尾部是列表的其余部分。可以使用hdtl函数检索它们。让我们为变量分配一个列表并检索其头部和尾部。

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

这将使我们将列表的开头和结尾作为输出。上面的程序产生以下结果-

1
[2, 3]

注意-获取空列表的开头或结尾是错误的。

其他列表功能

Elixir标准库提供了很多处理列表的功能。我们将在这里看看其中的一些。您可以在此处查看其余列表

S.no. Function Name and Description
1

delete(list, item)

Deletes the given item from the list. Returns a list without the item. If the item occurs more than once in the list, just the first occurrence is removed.

2

delete_at(list, index)

Produces a new list by removing the value at the specified index. Negative indices indicate an offset from the end of the list. If index is out of bounds, the original list is returned.

3

first(list)

Returns the first element in list or nil if list is empty.

4

flatten(list)

Flattens the given list of nested lists.

5

insert_at(list, index, value)

Returns a list with value inserted at the specified index. Note that index is capped at the list length. Negative indices indicate an offset from the end of the list.

6

last(list)

Returns the last element in list or nil if list is empty.

元组

元组也是数据结构,在其中存储了许多其他结构。与列表不同,它们将元素存储在连续的内存块中。这意味着按索引访问元组元素或获取元组大小是一项快速的操作。索引从零开始。

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_eleminsert_at返回了新的元组。由于Elixir数据类型是不可变的,因此未修改存储在tuple变量中的原始元组。通过不可变,Elixir代码更易于推理,因为您无需担心特定代码是否在适当地改变您的数据结构。

元组与列表

列表和元组有什么区别?

列表以链接列表的形式存储在内存中,这意味着列表中的每个元素都会保留其值并指向下一个元素,直到到达列表的末尾。我们称每对值和指针为一个cons单元。这意味着访问列表的长度是线性操作:我们需要遍历整个列表才能确定其大小。只要我们先添加元素,更新列表的速度就很快。

另一方面,元组连续存储在内存中。这意味着获取元组大小或按索引访问元素很快。但是,更新或向元组添加元素很昂贵,因为它需要将整个元组复制到内存中。