Elixir-lists-and-tuples
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では、シングルクォートとダブルクォートの表現は異なるタイプで表現されるため、同等ではありません。
リストの長さ
リストの長さを見つけるには、次のプログラムのように長さ関数を使用します-
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]
注-空のリストの先頭または末尾を取得するとエラーになります。
その他のリスト関数
Elixir標準ライブラリは、リストを処理するための多くの機能を提供します。 ここでそれらのいくつかを見ていきます。 残りはhttp://elixir-lang.org/docs/stable/elixir/Listl[List]で確認できます。
S.no. | Function Name and Description |
---|---|
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コードは不変であるため、特定のコードがデータ構造を適切に変更しているかどうかを心配する必要がないため、推論が容易です。
タプルvs. リスト
リストとタプルの違いは何ですか?
リストはリンクリストとしてメモリに保存されます。つまり、リスト内の各要素は値を保持し、リストの最後に達するまで次の要素を指します。 値とポインターの各ペアをコンスセルと呼びます。 これは、リストの長さにアクセスすることは線形操作であることを意味します。サイズを計算するためにリスト全体を走査する必要があります。 リストの更新は、要素を追加している限り高速です。
一方、タプルはメモリに連続して格納されます。 これは、タプルサイズの取得またはインデックスによる要素へのアクセスが高速であることを意味します。 ただし、要素をタプルに更新または追加するには、メモリ内のタプル全体をコピーする必要があるため、コストがかかります。