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]

列表的頭和尾

頭是列表的第一個元素,尾是列表的其餘部分。它們可以使用hdtl函式檢索。讓我們將列表分配給一個變數並檢索其頭和尾。

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

這將輸出列表的頭和尾。上述程式生成以下結果 -

1
[2, 3]

注意 - 獲取空列表的頭或尾是錯誤的。

其他列表函式

Elixir 標準庫提供了大量用於處理列表的函式。我們將在本文中介紹其中的一些。

序號 函式名稱和描述
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_eleminsert_at返回了新的元組。儲存在 tuple 變數中的原始元組沒有被修改,因為 Elixir 資料型別是不可變的。透過不可變性,Elixir 程式碼更容易推理,因為您永遠不必擔心特定程式碼是否正在就地修改您的資料結構。

元組與列表

列表和元組有什麼區別?

列表在記憶體中以連結列表的形式儲存,這意味著列表中的每個元素都儲存其值並指向下一個元素,直到到達列表的末尾。我們將每對值和指標稱為 cons 單元格。這意味著訪問列表的長度是一個線性操作:我們需要遍歷整個列表才能確定其大小。更新列表很快,只要我們正在預先新增元素。

另一方面,元組在記憶體中連續儲存。這意味著透過索引獲取元組大小或訪問元素的速度很快。但是,更新或向元組新增元素代價很高,因為它需要在記憶體中複製整個元組。

廣告