Elixier - Listen und Tupel
(Verknüpfte) Listen
Eine verknüpfte Liste ist eine heterogene Liste von Elementen, die an verschiedenen Stellen im Speicher gespeichert und mithilfe von Referenzen verfolgt werden. Verknüpfte Listen sind Datenstrukturen, die insbesondere in der funktionalen Programmierung verwendet werden.
Elixir verwendet eckige Klammern, um eine Liste von Werten anzugeben. Werte können von jedem Typ sein -
[1, 2, true, 3]
Wenn Elixir eine Liste druckbarer ASCII-Nummern sieht, druckt Elixir diese als Zeichenliste (buchstäblich eine Liste von Zeichen). Immer wenn Sie einen Wert in IEx sehen und nicht sicher sind, was er ist, können Sie den verwendeni Funktion zum Abrufen von Informationen darüber.
IO.puts([104, 101, 108, 108, 111])
Die obigen Zeichen in der Liste sind alle druckbar. Wenn das obige Programm ausgeführt wird, wird das folgende Ergebnis erzeugt:
hello
Sie können Listen auch umgekehrt in einfachen Anführungszeichen definieren -
IO.puts(is_list('Hello'))
Wenn das obige Programm ausgeführt wird, wird das folgende Ergebnis erzeugt:
true
Beachten Sie, dass Darstellungen in einfachen und doppelten Anführungszeichen in Elixir nicht gleichwertig sind, da sie durch verschiedene Typen dargestellt werden.
Länge einer Liste
Um die Länge einer Liste zu ermitteln, verwenden wir die Längenfunktion wie im folgenden Programm:
IO.puts(length([1, 2, :true, "str"]))
Das obige Programm generiert das folgende Ergebnis:
4
Verkettung und Subtraktion
Mit dem können zwei Listen verkettet und subtrahiert werden ++ und --Betreiber. Betrachten Sie das folgende Beispiel, um die Funktionen zu verstehen.
IO.puts([1, 2, 3] ++ [4, 5, 6])
IO.puts([1, true, 2, false, 3, true] -- [true, false])
Dadurch erhalten Sie im ersten Fall eine verkettete Zeichenfolge und im zweiten eine subtrahierte Zeichenfolge. Das obige Programm generiert das folgende Ergebnis:
[1, 2, 3, 4, 5, 6]
[1, 2, 3, true]
Kopf und Schwanz einer Liste
Der Kopf ist das erste Element einer Liste und der Schwanz ist der Rest einer Liste. Sie können mit den Funktionen abgerufen werdenhd und tl. Lassen Sie uns einer Variablen eine Liste zuweisen und ihren Kopf und Schwanz abrufen.
list = [1, 2, 3]
IO.puts(hd(list))
IO.puts(tl(list))
Dies gibt uns den Kopf und das Ende der Liste als Ausgabe. Das obige Programm generiert das folgende Ergebnis:
1
[2, 3]
Note - Das Abrufen des Kopfes oder des Endes einer leeren Liste ist ein Fehler.
Andere Listenfunktionen
Die Elixir-Standardbibliothek bietet eine Vielzahl von Funktionen für den Umgang mit Listen. Wir werden uns einige davon hier ansehen. Den Rest können Sie hier auflisten .
S.no. | Funktionsname und Beschreibung |
---|---|
1 | delete(list, item) Löscht das angegebene Element aus der Liste. Gibt eine Liste ohne das Element zurück. Wenn das Element mehr als einmal in der Liste vorkommt, wird nur das erste Vorkommen entfernt. |
2 | delete_at(list, index) Erstellt eine neue Liste, indem der Wert am angegebenen Index entfernt wird. Negative Indizes geben einen Versatz vom Ende der Liste an. Wenn der Index außerhalb der Grenzen liegt, wird die ursprüngliche Liste zurückgegeben. |
3 | first(list) Gibt das erste Element in der Liste zurück oder nil, wenn die Liste leer ist. |
4 | flatten(list) Glättet die angegebene Liste verschachtelter Listen. |
5 | insert_at(list, index, value) Gibt eine Liste mit einem Wert zurück, der am angegebenen Index eingefügt wurde. Beachten Sie, dass der Index auf die Listenlänge begrenzt ist. Negative Indizes geben einen Versatz vom Ende der Liste an. |
6 | last(list) Gibt das letzte Element in der Liste zurück oder nil, wenn die Liste leer ist. |
Tupel
Tupel sind auch Datenstrukturen, in denen eine Reihe anderer Strukturen gespeichert sind. Im Gegensatz zu Listen speichern sie Elemente in einem zusammenhängenden Speicherblock. Dies bedeutet, dass der Zugriff auf ein Tupelelement pro Index oder das Abrufen der Tupelgröße ein schneller Vorgang ist. Indizes beginnen bei Null.
Elixir verwendet geschweifte Klammern, um Tupel zu definieren. Tupel können wie Listen jeden Wert enthalten -
{:ok, "hello"}
Länge eines Tupels
Verwenden Sie die Taste, um die Länge eines Tupels zu ermitteln tuple_size Funktion wie im folgenden Programm -
IO.puts(tuple_size({:ok, "hello"}))
Das obige Programm generiert das folgende Ergebnis:
2
Wert anhängen
Verwenden Sie die Funktion Tuple.append, um einen Wert an das Tupel anzuhängen.
tuple = {:ok, "Hello"}
Tuple.append(tuple, :world)
Dadurch wird ein neues Tupel erstellt und zurückgegeben: {: ok, "Hallo" ,: Welt}
Einfügen eines Wertes
Um einen Wert an einer bestimmten Position einzufügen, können Sie entweder die verwenden Tuple.insert_at Funktion oder die put_elemFunktion. Betrachten Sie das folgende Beispiel, um dasselbe zu verstehen:
tuple = {:bar, :baz}
new_tuple_1 = Tuple.insert_at(tuple, 0, :foo)
new_tuple_2 = put_elem(tuple, 1, :foobar)
Beachte das put_elem und insert_atgab neue Tupel zurück. Das in der Tupelvariablen gespeicherte ursprüngliche Tupel wurde nicht geändert, da die Elixir-Datentypen unveränderlich sind. Da Elixir-Code unveränderlich ist, ist es einfacher, darüber nachzudenken, da Sie sich keine Sorgen machen müssen, wenn ein bestimmter Code Ihre Datenstruktur verändert.
Tupel gegen Listen
Was ist der Unterschied zwischen Listen und Tupeln?
Listen werden als verknüpfte Listen gespeichert, dh jedes Element in einer Liste behält seinen Wert und zeigt auf das folgende Element, bis das Ende der Liste erreicht ist. Wir nennen jedes Wertepaar und jeden Zeiger eine Nachteilezelle. Dies bedeutet, dass der Zugriff auf die Länge einer Liste eine lineare Operation ist: Wir müssen die gesamte Liste durchlaufen, um ihre Größe herauszufinden. Das Aktualisieren einer Liste ist schnell, solange Elemente vorangestellt werden.
Tupel hingegen werden zusammenhängend im Speicher gespeichert. Dies bedeutet, dass das Abrufen der Tupelgröße oder der Zugriff auf ein Element über den Index schnell erfolgt. Das Aktualisieren oder Hinzufügen von Elementen zu Tupeln ist jedoch teuer, da das gesamte Tupel im Speicher kopiert werden muss.