Container - flutter-tutorial-de/dart-basics-tutorial GitHub Wiki

Table of Contents

Einleitung

Im Folgenden werden drei neue Typen vorgestellt, die das Programmieren in Dart einfacher machen: Listen, Maps und Mengen.

Liste (List)

Eine Liste (Datentyp List) ist ein Behälter, der Elemente von gleichem Datentyp enthalten kann. Die Elemente habe eine Reihenfolge, die sich durch das Einfügen ergibt. Mittels des Index (der Positionsnummer, beginnend mit 0) kann auf ein Listenelement zugegriffen werden.

Beispiel 1:

final hours = [ 2, 4, 6, 8 ];
  • Hier wird eine Liste namens hours definiert, die die Ganzzahlen 2, 4, 6 und 8 enthält.
  • hours[0] liefert 2, hours[1] liefert 4
Beispiel 2:
void main(){
  final users = <String>[];
  users.add('adam');
  users.add('eve');
  final userCount = users.length;
  final element1 = users[0];
  final element2 = users[1];
  print('Anzahl: $userCount Elemente: $element1 $element2');
  print('Benutzer ' + (users.isEmpty ? 'nicht ' : '') + 'vorhanden');
  users[0] = 'charly';
  print(users);
}
  • Erst wird eine Liste namens users definiert, die leer ist (kein Element zwischen den eckigen Klammern). Der Datentyp wird als String festgelegt.
  • Dann werden zwei Elemente eingetragen. Das geschieht nicht durch Zuweisung, sondern durch die Methode add(). Eine Methode ist eine Art Funktion, die mittels '.' an den Variablennamen users angehängt wird und die Variable in diesem Fall ändert. Näheres in Kapitel Klasse.
  • users.length Mit dem Attribut length wird die Anzahl der Elemente in der Liste users abgefragt.
  • users[0] Liefert das Element mit Index 0, das erste Element.
  • users[1] Liefert das Element mit Index 1, das zweite Element.
  • users.isEmpty ? 'nicht ' : '' Prüfung, ob Liste leer ist. Wenn ja wird "nicht ", sonst "" abgeliefert.
  • users[0] = "charly"; Elemente in der Liste können geändert werden.
  • users.contains("charly"); Test, ob "charly" in der Liste ist.
Dem ganz aufmerksamen Leser wird auffallen, dass die Liste mit final users als unveränderlich markiert ist, aber dann problemlos geändert werden kann: die Variable ist ja ein Container, und der Container (als Behälter) wird nicht geändert, sondern nur der Inhalt.

for-Schleife

Für Listen gibt es eine spezielle for-Anweisung:

void main() {
  for (var element in [2, 4, 6, 8]) {
    print(element);
  }
}
  • for (var element in [2, 4, 6, 8]) erzeugt eine Variable namens element, die im Schleifenblock nacheinander die Wert aus der Liste, also 2, 4, 6 und 8 annimmt.

Strings sind spezielle Listen

Der Datentyp String ist eine spezielle Liste von Zeichen: Viele Methoden/Attribute, die es bei Listen gibt, gibt es auch bei Strings:

  • "abc".length ist die Anzahl Zeichen, hier also 3.
  • "Jippi"[2] liefert "p" (das (2+1).te Zeichen.
  • Strings sind nicht änderbar, also funktioniert s.add() nicht.
  • Die Listen-for-Schleife geht nicht bei Strings.

Map

Auf eine Liste kann über den Index zugegriffen werden, wobei der Index eine positive Ganzzahl oder 0 ist. Die Map verallgemeinert dieses Prinzip auf beliebige Indizes von beliebigem Datentyp.

Definition: Eine Map ist ein Container von Schlüssel-Wert-Paaren. Ist der Schlüssel eines Paares bekannt, kann mittels dieses Schlüssels auf den Wert zugegriffen werden.

Der Datentyp aller Schlüssel einer Map sind gleich, der Datentyp aller Werte sind gleich, Schlüsseltyp und Wertetyp können verschieden sein.

Beispiel

void main() {
  final yearOfUser = <String, int>{'joe': 1998, 'bob': 2001};
  yearOfUser['adam'] = 1970;
  yearOfUser['eve'] = 2020;
  if (! yearOfUser.containsKey('joe')){
    print('missing joe');
  }
  for (var user in yearOfUser.keys) {
    final year = yearOfUser[user];
    print("$user: $year");
  }
}
  • final yearOfUser = <String, int>{}; Wir vereinbaren eine Variable yearOfUser mit Schlüsseltyp String und Wertetyp int und initialisieren sie mit zwei Schlüssel-Wert-Paaren.
  • yearOfUser['adam'] = 1970; Wir fügen ein Paar mit Schlüssel 'adam' und Wert 1970 hinzu.
  • if (! yearOfUser.containsKey('joe')) Hier wird abgefragt, ob der Schlüssel 'joe' in der Map vorkommt.
  • for (var user in yearOfUser.keys) Das Attribut keys liefert eine Liste der Schlüssel der Map yearOfUser. Die Schleife durchläuft also alle Schlüssel der Map, d. h. die Variable 'user' bekommt der Reihe nach alle Schlüssel zugewiesen.
  • final year = yearOfUser[user]; Es wird das Geburtsjahr des Benutzers aus der Map geholt.

Menge (Set)

Eine Menge (Datentyp Set) ist eine spezielle Form der Map, bei der kein Wert existiert, sondern nur ein Schlüssel. Im Unterschied zur Liste kann jeder Schlüssel nur einmal in der Menge existieren. Der Datentyp ist für alle Schlüssel gleich.

Beispiel

void show(String prefix, Set set) {
  var rc = '(';
  for (var item in set) {
    rc += ' $item';
  }
  print('$prefix: $rc)');
}
void main(){
  final set1 = <int>{};
  set1.add(1);
  set1.add(1000);
  show('set1', set1);
  if (! set1.contains(1)){
    print('1 gefunden');
  }
  set1.addAll({ 2, 4});
  show('jetzt mit 2,4', set1);
  final set2 = set1.union({2, 3, 5});
  show('Vereinigung mit (2, 3, 5):', set2);
  final set3 = set1.intersection({1, 3, 1000});
  show('Schnitt mit (1, 3, 1000)', set3);
  final set4 = set1.difference({2, 3, 1000});
  show('Differenz zu (2, 3, 1000):', set4); 
}
  • Die Funktion show() zeigt einen Vorspann und dann die Elemente einer Liste. Dazu werden alle Elemente mittels einer for-Schleife durchlaufen.
  • final set1 = <int>{}; Es wird eine leere Menge vereinbart (nichts zwischen den geschweiften Klammern), mit Datentyp int.
  • set1.add(1); Es wird ein einzelnes Element zur Menge hinzugefügt.
  • if (! set1.contains(1)) Hier wird abgefragt, ob die Zahl 1 schon in der Menge enthalten ist.
  • set1.addAll({ 2, 4}); Hier wird die Menge { 2, 4} zur Menge set1 hinzugefügt.
  • final set2 = set1.union({2, 3, 5}); union() bildet die Vereinigungsmenge von set1 und der angegebenen Menge {2, 3, 5}: Die Vereinigung von zwei Mengen sind alle Elemente der einen und die der zweiten, wobei es (wie immer bei Mengen) keine Dupletten gibt.
  • final set3 = set1.intersection({1, 3, 1000}); intersection() bildet die Schnittmenge, das ist die Menge der Elemente, die in beiden Mengen vorkommen.
  • final set3 = set1.difference({2, 3, 1000}); difference() zieht von set1 die Menge {2, 3, 1000} ab, d. h. die Ergebnismenge ist set1 ohne die Elemente {2, 3, 1000}.

Weiter geht es mit Kapitel* String und regulärer Ausdruck.
⚠️ **GitHub.com Fallback** ⚠️