Sammlungen und Listen

Abgeschlossen

Sie könnten sich in einer Situation befinden, in der Sie über viele Daten eines bestimmten Datentyps verfügen. In dieser Situation können Sie nun entweder für jedes Datenelement eine Variable erstellen, oder Sie gruppieren die Elemente in einer Sammlung. Das Gruppieren der Daten bietet Ihnen Vorteile, wie z. B. die Möglichkeit, Methoden nicht nur für einzelne Daten, sondern auch für die Sammlung als Ganzes durchzuführen.

Sammlungen

Der erste Hinweis, der für die Nutzung einer Sammlung spricht, ist das Vorhandensein mehrerer Datenelemente desselben Datentyps. Dies gilt etwa, wie im folgenden Code veranschaulicht, für ein Szenario, in dem Sie über viele Einträge verfügen:

let logEntryMonday = "first entry"
let logEntryTuesDay = "second entry"
let logEntryWednesday = "third entry"

In diesem Beispiel könnten Sie dem Code immer weiter Einträge hinzufügen. Doch diese Vorgehensweise werden Sie bald als unpraktisch empfinden. Die einzelnen Einträge hängen nicht nur zusammen, sondern weisen auch denselben Typ auf. Ist es dann sinnvoll, für jeden Eintrag eine neue Variable zu erstellen? Wahrscheinlich nicht. In diesem Fall ist die Verwendung einer Sammlung sinnvoll, für die Sie eine logische und verwaltbare Gruppierung erstellen, wie etwa das Hinzufügen oder Entfernen von Daten:

logEntriesWeek = ["first entry"; "second entry"; "third entry"]

Für diesen Code sind nicht nur weniger Eingaben erforderlich, sondern er weist auch eine Ordnung auf, anhand derer zusammengehörige Elemente auch zusammen gruppiert werden.

Welche Vorteile bietet F#? Zunächst einmal bietet es drei Arten von Sammlungen, die jeweils für eine bestimmte Situation konzipiert wurden.

  • Listen: Eine Liste in F# ist eine geordnete, unveränderliche Gruppe von Elementen desselben Typs. Eine unveränderliche Liste ist möglicherweise leistungsfähiger als ein Array, doch das Ändern Ihres Inhalts erfordert mehr Kreativität. Eine Möglichkeit besteht z. B. darin, basierend auf einer vorhandenen Liste eine neue Liste erstellen. In dieser Lerneinheit liegt der Schwerpunkt auf der Verwendung von Listen.

  • Arrays: Arrays sind feste, änderbare Auflistungen von Datenelementen desselben Typs, die fortlaufend mit einem nullbasierten Index sortiert werden. Einer veränderlichen Sammlung können zwar leicht Datenelemente hinzugefügt und entfernt werden, jedoch kann es dabei zu Leistungseinbußen kommen.

  • Sequenzen: Eine Sequenz ist eine logische Reihe von Elementen desselben Typs. Eine Sequenz verhält sich wie eine Just-In-Time-Sammlung, da sie gut für große Datensammlungen geeignet ist, von denen voraussichtlich nicht alle Elemente genutzt werden. Zudem werden die Elemente nur bei Bedarf berechnet. Daher können Sequenzen in bestimmten Situationen leistungsfähiger sein als Listen.

Listen

Wie bereits erwähnt ist eine Liste eine geordnete, unveränderliche Gruppe von Elementen. Die nachfolgenden Beispiele zeigen einige Möglichkeiten, wie Sie eine Liste erstellen können:

let cards = ["Ace"; "King"; "Queen"]

In diesem Code werden die Elemente in eckige Klammern ([]) eingeschlossen, um die Liste zu definieren. Die Listenelemente werden durch ein Semikolon (;) voneinander getrennt.

Eine weitere Möglichkeit zum Erstellen einer Liste besteht darin, jedes Element in eine neue Zeile zu platzieren. Durch diese Methode sind auch keine Semikolons erforderlich.

let cards = [
  "Ace"
  "King"
  "Queen"
]

Die Elemente einer Liste müssen denselben Typ aufweisen. Daher ist die folgende Deklaration nicht zulässig:

let cards = [ 1; "Ace"; "King" ] // not permitted

In diesem Code enthält die Deklaration sowohl Zahlen als auch Zeichenfolgen und ist daher nicht zulässig. Eine weitere Möglichkeit zum Erstellen einer Liste ist die Verwendung eines Bereichsoperators (..). Dabei werden die Start- und das Endelemente angegeben und durch einen Bereichsoperator (..) voneinander getrennt. Auf diese Weise werden alle Zahlen vom Start- zum Endelement einschließlich der dazwischen liegenden Zahlen erstellt. So können Sie beispielsweise die Zahlenreihe 1 2 3 4 5 mit dem folgenden Code erstellen:

let numbers = [ 1 .. 5 ]

Ändern einer Liste

Wie bereits erwähnt, können Listen nicht geändert werden. Mit einer etwas anderen Herangehensweise können Sie jedoch das gleiche Ergebnis erzielen und so einer Liste ein Element oder sogar eine Liste von Elementen hinzufügen. Was bedeutet das? Betrachten Sie das folgende Beispiel:

let cards = ["Ace"; "King"; "Queen"]

Der vorherige Code stellt eine Liste bestehend aus drei Zeichenfolgen dar. Mithilfe des Doppelpunktoperators (::) können Sie ein Element an den Anfang der Liste anfügen. Auf diese Weise erhalten Sie eine neue Liste, während die alte Liste unverändert bleibt:

let cards = ["Ace"; "King"; "Queen"]
let newList = "Jack" :: cards // "Jack", "Ace", "King", "Queen" 

Mithilfe des @-Zeichenoperators können Sie sogar eine ganze Liste von Elementen hinzufügen:

let cards = ["Ace"; "King"; "Queen"]
let otherCardList = ["Jack"; "10"]
let fullList = cards @ otherCardList // "Ace", "King", "Queen", "Jack", "10"

Das Listenmodul enthält eine append()-Funktion, die sowohl für Array- als auch für Sequenzsammlungen ausgeführt werden kann. Die Verwendung von append() ist geeignet in Fällen, in denen Sie beispielsweise den Sammlungstyp von „Liste“ in „Sequenz“ ändern möchten oder wenn Sie sich nicht mit einer neuen Methode zum Hinzufügen von Elementen vertraut machen möchten. Mithilfe des @-Zeichens können Sie nur Listen mit einer Listenstruktur Elemente hinzufügen. Sehen wir uns die beiden Beispiele noch einmal an und verwenden stattdessen append():

let cards = ["Ace"; "King"; "Queen"]
let otherCardList = ["10"; "9"]
let fullList = cards |> List.append ["Jack"] // "Jack", "Ace", "King", "Queen"
let fullList = cards |> List.append otherCardList // "10", "9", "Ace", "King", "Queen"

Eigenschaften

Listen in F# werden als verknüpfte Listen implementiert. Das bedeutet, dass jedes Element mit einem anderen Element in der Liste verbunden ist. Weitere Zu lernende Begriffe sind Kopf, das erste Element in der Liste und Tail, die die Elemente enthält, die sich nicht im Kopf befinden. In der Liste 1 2 3 4 stellt z. B. 1 das Head-Element und 2 3 4 das Tail-Element dar.

Wenn Sie die Elemente auf diese Weise voneinander trennen, können Sie schnell auf das erste Element zugreifen, um es zu lesen, zu entfernen oder andere Aktionen auszuführen. Wenn Sie auf ein bestimmtes Element in der Liste zugreifen möchten, können Sie die auf einem nullbasierten Index beruhende Eigenschaft Item verwenden:

let list = [1; 2; 3; 4]
list.Item 1 // 2

In der folgenden Tabelle werden die Eigenschaften einer Liste beschrieben:

Eigenschaft Beschreibung
Head Das erste Element in einer Liste.
Empty Gibt eine leere Liste zurück und kann verwendet werden, wenn Sie eine leere Liste erstellen möchten.
IsEmpty Überprüft, ob die aktuelle Liste leer ist.
Item Ruft das aktuelle Element an der angegebenen Position ab (nullbasierter Index)
Length Gibt die Anzahl von Elementen in der Liste zurück
Tail Gibt alle Elemente bis auf das erste Element in der Liste zurück.