Elixir - 列表和元组
(链表)列表
链表是元素的异构列表,这些元素存储在内存中的不同位置,并通过使用引用来跟踪。 链表是特别用于函数式编程的数据结构。
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 中并不等效,因为它们由不同的类型表示。
列表的长度
要查找列表的长度,我们使用 length 函数,如以下程序所示 −
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 |
delete(list, item) 从列表中删除给定的项目。 返回没有该项目的列表。 如果该项目在列表中出现多次,则仅删除第一次出现的项目。 |
2 |
delete_at(list, index) 通过删除指定索引处的值来生成新列表。 负索引表示距列表末尾的偏移量。 如果索引越界,则返回原始列表。 |
3 |
first(list) 返回列表中的第一个元素,如果列表为空,则返回 nil。 |
4 |
flatten(list) 展平给定的嵌套列表列表。 |
5 |
insert_at(list, index, value) 返回一个列表,其中在指定索引处插入了值。 请注意,索引的上限为列表长度。 负索引表示距列表末尾的偏移量。 |
6 |
last(list) 返回列表中的最后一个元素,如果列表为空,则返回 nil。 |
元组
元组也是一种数据结构,其中存储了许多其他结构。 与列表不同,它们将元素存储在连续的内存块中。 这意味着访问每个索引的元组元素或获取元组大小是一个快速操作。 索引从零开始。
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 单元。 这意味着访问列表的长度是一个线性操作:我们需要遍历整个列表才能计算出其大小。 只要我们在前面添加元素,更新列表就很快。
另一方面,元组是连续存储在内存中的。 这意味着获取元组大小或通过索引访问元素的速度很快。 然而,更新元组或向元组添加元素的成本很高,因为它需要复制内存中的整个元组。