W3docs

Wie man eine ArrayList in Java sortiert

ArrayList in Java sortieren mit Collections.sort, List.sort, Comparable und Comparator.

Das Sortieren einer ArrayList ordnet ihre Elemente an Ort und Stelle neu. Das JDK bietet zwei Einstiegspunkte — Collections.sort und die List.sort-Instanzmethode — sowie Comparator für beliebige benutzerdefinierte oder umgekehrte Reihenfolgen. Dieses Kapitel zeigt die idiomatischen Vorgehensweisen, erklärt, warum Zeichenketten mit gemischter Groß-/Kleinschreibung so sortiert werden, wie sie es tun, und schließt mit einem ausführbaren Beispiel ab, das Sie nebeneinander vergleichen können.

In natürlicher Reihenfolge sortieren

Für Elemente, die Comparable implementieren (wie String, Integer oder LocalDate), sortiert Collections.sort sie in ihrer natürlichen Reihenfolge.

List<String> names = new ArrayList<>(List.of("Charlie", "Bob", "Alice"));
Collections.sort(names);
System.out.println(names); // [Alice, Bob, Charlie]

Das gleiche Ergebnis liefert die Instanzmethode names.sort(null)null als Comparator zu übergeben bedeutet „natürliche Reihenfolge verwenden." Die Sortierung erfolgt an Ort und Stelle, sodass die ursprüngliche Liste neu geordnet und nicht kopiert wird.

Mit List.sort und einem Comparator sortieren

Seit Java 8 hat List seine eigene sort(Comparator)-Methode. Sie lässt sich flüssiger lesen und passt gut zu den Comparator-Factory-Methoden.

List<String> names = new ArrayList<>(List.of("Charlie", "Bob", "Alice"));
names.sort(Comparator.naturalOrder());        // ascending
names.sort(Comparator.reverseOrder());        // descending
names.sort(String.CASE_INSENSITIVE_ORDER);    // ignore letter case

Comparator lässt sich auch verketten. Comparator.comparingInt(String::length).thenComparing(Comparator.naturalOrder()) sortiert zuerst nach Länge und bricht Gleichstände alphabetisch auf. Für Objekte schlüsselt Comparator.comparing(Person::lastName) nach einem beliebigen Feld.

AnsatzVerwenden, wenn
Collections.sort(list)Natürliche Reihenfolge, ältere Codebasen
list.sort(Comparator)Modern, lesbar, benutzerdefinierte Reihenfolgen
Comparator.reverseOrder()Absteigende natürliche Reihenfolge
Comparator.comparing(...)Objekte nach einem Feld sortieren

Auf die Standard-String-Reihenfolge achten

Die natürliche String-Reihenfolge basiert auf Unicode-Codepunkten, sodass jeder Großbuchstabe (AZ) vor jedem Kleinbuchstaben (az) sortiert wird. "Bob" kommt vor "alice".

List<String> mixed = new ArrayList<>(List.of("alice", "Bob"));
mixed.sort(Comparator.naturalOrder());
System.out.println(mixed); // [Bob, alice]

Wenn Sie eine Groß-/Kleinschreibung-unabhängige Reihenfolge wünschen, verwenden Sie String.CASE_INSENSITIVE_ORDER. Für sprachbewusste Sortierung (Akzente, Locale-Regeln) verwenden Sie stattdessen einen java.text.Collator.

Ein ausführbares Beispiel

Dieses Beispiel beginnt mit einer Liste und sortiert dann Kopien davon auf vier verschiedene Arten, damit Sie die Ergebnisse nebeneinander vergleichen können. Die ursprüngliche Liste bleibt unberührt.

java— editable, runs on the server

Was man dem Lauf entnehmen kann:

  • Die natürliche Reihenfolge gibt [Bob, Charlie, alice] aus, weil Großbuchstaben-Codepunkte vor Kleinbuchstaben sortiert werden.
  • Comparator.reverseOrder() kehrt diese natürliche Reihenfolge zu [alice, Charlie, Bob] um.
  • String.CASE_INSENSITIVE_ORDER ignoriert die Groß-/Kleinschreibung und liefert [alice, Bob, Charlie].
  • Der Längen-Comparator ergibt [Bob, alice, Charlie] — 3, dann 5, dann 7 Buchstaben.
  • Die original-Liste gibt immer noch [Charlie, alice, Bob] in ihrer Einfügereihenfolge aus und beweist, dass jede Sortierung auf einer Kopie und nicht auf der Quelle ausgeführt wurde.

Übungen

Übung
Welcher Aufruf sortiert eine ArrayList von Strings in absteigender Reihenfolge?
Welcher Aufruf sortiert eine ArrayList von Strings in absteigender Reihenfolge?
Was this page helpful?