Elixir-リストとタプル

(リンク)リスト

リンクリストは、メモリ内のさまざまな場所に格納され、参照を使用して追跡される要素の異種リストです。リンクリストは、関数型プログラミングで特に使用されるデータ構造です。

Elixirは、角括弧を使用して値のリストを指定します。値は任意のタイプにすることができます-

[1, 2, true, 3]

Elixirが印刷可能なASCII番号のリストを見ると、Elixirはそれをcharリスト(文字通り文字のリスト)として印刷します。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

連結と減算

2つのリストは、を使用して連結および減算できます。 ++ そして --演算子。関数を理解するために、次の例を検討してください。

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

これにより、最初のケースでは連結された文字列が得られ、2番目のケースでは減算された文字列が得られます。上記のプログラムは次の結果を生成します-

[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)

リストの最初の要素を返します。リストが空の場合は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セルと呼びます。これは、リストの長さにアクセスすることは線形操作であることを意味します。リストのサイズを把握するには、リスト全体をトラバースする必要があります。要素を追加している限り、リストの更新は高速です。

一方、タプルはメモリに連続して格納されます。これは、タプルサイズの取得またはインデックスによる要素へのアクセスが高速であることを意味します。ただし、要素をタプルに更新または追加するには、タプル全体をメモリにコピーする必要があるため、コストがかかります。