CodeGym /Kurse /JAVA 25 SELF /Suche und Sortierung von Elementen in Java-Collections

Suche und Sortierung von Elementen in Java-Collections

JAVA 25 SELF
Level 29 , Lektion 4
Verfügbar

1. Suche von Elementen in Collections

Suche mit Standardmethoden

Wenn wir eine Liste haben, zum Beispiel von Namen:

List<String> names = List.of("Anna", "Boris", "Viktoria", "Anna", "Dmitri");

Java bietet mehrere bequeme Methoden für die Suche:

  • contains(Object o) – prüft, ob ein Element in der Collection vorhanden ist.
  • indexOf(Object o) – gibt den ersten Index des Vorkommens eines Elements zurück (oder -1, wenn nicht gefunden).
  • lastIndexOf(Object o) – gibt den letzten Index des Vorkommens zurück (oder -1).

Beispiele:

System.out.println(names.contains("Anna"));      // true
System.out.println(names.indexOf("Anna"));       // 0
System.out.println(names.lastIndexOf("Anna"));   // 3
System.out.println(names.contains("Sergej"));    // false

Fakt: Für Collections vom Typ Set gibt es keine Methoden indexOf und lastIndexOf – ein Set hat überhaupt keine Indizes, nur eindeutige Werte.

Suche nach Bedingung

Manchmal muss man nicht einen konkreten Wert finden, sondern ein Element, das einer Bedingung entspricht. Zum Beispiel den ersten Namen mit mehr als 6 Zeichen finden. Eine normale for-Schleife eignet sich hervorragend: Sobald ein passendes Element gefunden wurde – verwenden Sie break.

List<String> names = List.of("Anna", "Boris", "Viktoria", "Anna", "Dmitri");

String found = null;
for (String name : names) {
    if (name.length() > 6) {
        found = name;
        break; // Erstes passendes Element gefunden – Schleife kann verlassen werden
    }
}
System.out.println(found); // Viktoria

Suche nach dem maximalen und minimalen Wert

Für Collections mit vergleichbaren Elementen (z. B. Zahlen) kann man Maximum und Minimum schnell mit der Klasse Collections finden.

List<Integer> numbers = List.of(10, 5, 20, 7, 20, 3);

int max = Collections.max(numbers); // 20
int min = Collections.min(numbers); // 3

System.out.println("Maximum: " + max);
System.out.println("Minimum: " + min);

Wichtig: Die Elemente müssen vergleichbar sein ( Comparable implementieren), andernfalls muss ein Comparator übergeben werden.

2. Sortierung von Collections

Standardsortierung einer Liste

Sortieren kann man nur veränderliche Listen (z. B. ArrayList, LinkedList). Collections vom Typ Set und Map unterstützen keine direkte Sortierung.

Standardmäßig erfolgt die Sortierung nach der „natürlichen Ordnung“: bei Zahlen – aufsteigend, bei Strings – alphabetisch.

List<Integer> numbers = new ArrayList<>(List.of(5, 1, 7, 3));
Collections.sort(numbers);
System.out.println(numbers); // [1, 3, 5, 7]

Dasselbe lässt sich über die Listenmethode sort erledigen:

List<Integer> numbers = new ArrayList<>(List.of(5, 1, 7, 3));
numbers.sort(null); // null bedeutet: die natürliche Ordnung verwenden
System.out.println(numbers); // [1, 3, 5, 7]

Sortierung mit Comparator

Wenn man eine eigene Regel benötigt – z. B. Strings nach Länge sortieren:

List<String> words = new ArrayList<>(List.of("Katze", "Elefant", "Fliege", "Nashorn"));

words.sort(Comparator.comparingInt(String::length));
System.out.println(words); // [Katze, Fliege, Elefant, Nashorn]

In umgekehrter Reihenfolge:

words.sort(Comparator.comparingInt(String::length).reversed());
System.out.println(words); // [Elefant, Nashorn, Fliege, Katze]

Alter Stil über Collections.sort:

Collections.sort(words, Comparator.comparingInt(String::length));

3. Besonderheiten der Sortierung verschiedener Collections

Sortieren verändert nur die Liste

Die Sortiermethoden (sort, Collections.sort) funktionieren nur mit Collections, die eine Ordnung der Elemente unterstützen (z. B. List). Für Set und Map sind solche Methoden nicht vorgesehen.

Versuch, ein Set zu sortieren:

Set<Integer> mySet = new HashSet<>(List.of(3, 1, 2));
Collections.sort(mySet); // Kompilierfehler: sort erwartet eine List!

Wenn man eine sortierte Liste aus Set erhalten möchte:

List<Integer> sortedFromSet = new ArrayList<>(mySet);
Collections.sort(sortedFromSet);
System.out.println(sortedFromSet); // [1, 2, 3]

Sortierung einer Map: nach Schlüsseln und nach Werten

Eine Map lässt sich nicht direkt sortieren, aber man kann:

  • Eine Liste der „Schlüssel–Wert“-Paare erhalten
  • Sie nach Bedarf sortieren
  • Bei Bedarf eine neue Map zusammenstellen

Beispiel: Sortierung nach Werten

Map<String, Integer> scores = Map.of(
    "Anna", 15,
    "Boris", 20,
    "Vika", 12
);

List<Map.Entry<String, Integer>> entries = new ArrayList<>(scores.entrySet());
entries.sort(Map.Entry.comparingByValue());

for (Map.Entry<String, Integer> entry : entries) {
    System.out.println(entry.getKey() + ": " + entry.getValue());
}
// Vika: 12
// Anna: 15
// Boris: 20

Sortierung von Objekten nach einem Feld

Angenommen, wir haben eine Benutzerklasse:

class User {
    String name;
    int age;
    User(String name, int age) {
        this.name = name;
        this.age = age;
    }
    @Override
    public String toString() {
        return name + " (" + age + ")";
    }
}

Und eine Liste von Benutzern:

List<User> users = new ArrayList<>(List.of(
    new User("Anna", 22),
    new User("Boris", 18),
    new User("Vika", 25)
));

Wir sortieren nach Alter:

users.sort(Comparator.comparingInt(u -> u.age));
System.out.println(users); // [Boris (18), Anna (22), Vika (25)]

In umgekehrter Reihenfolge:

users.sort(Comparator.comparingInt((User u) -> u.age).reversed());
System.out.println(users); // [Vika (25), Anna (22), Boris (18)]

4. Typische Fehler bei Suche und Sortierung von Collections

Fehler Nr. 1: Sortieren einer unveränderlichen Liste. Listen, die über List.of(...) erzeugt wurden, dürfen nicht verändert werden – beim Aufruf von sort erhalten Sie eine UnsupportedOperationException.

List<Integer> immutable = List.of(3, 1, 2);
immutable.sort(null); // Wirft eine Exception!

Fehler Nr. 2: Ein Set oder eine Map direkt sortieren. Die Sortiermethoden funktionieren nicht mit Set und Map. Wenn Sie sortieren müssen, wandeln Sie die Daten zuerst in eine Liste um.

Fehler Nr. 3: Falscher Objektvergleich. Subtrahieren Sie bei Vergleichen ganze Zahlen nicht „frontal“ – es kann zu Überläufen kommen. Verwenden Sie statt u1.age - u2.age lieber Integer.compare oder Comparator.comparingInt.

// users.sort((u1, u2) -> u1.age - u2.age); // Funktioniert, ist aber bei Überlauf gefährlich!

Fehler Nr. 4: contains für komplexe Suchen verwenden. Die Methode contains prüft nur exakte Übereinstimmung (über equals). Wenn Sie nach einem Teilstring oder nach einem Feld eines Objekts suchen müssen, verwenden Sie eine Schleife mit Bedingungsprüfung oder Comparatoren/Streams.

1
Umfrage/Quiz
Comparatoren und das Vergleichen von Objekten, Level 29, Lektion 4
Nicht verfügbar
Comparatoren und das Vergleichen von Objekten
Comparatoren und das Vergleichen von Objekten
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION