Wann TreeSet verwenden(Java)?

1 Antwort

Vom Fragesteller als hilfreich ausgezeichnet

Hier wird beides Verglichen:

https://www.geeksforgeeks.org/hashset-vs-treeset-in-java/

Bzw in Kurz:

Treesets sind nützlich wenn du die Daten sortiert haben willst, da die Daten direkt so eingespeichert werden, sodass Abfragen wie, was ist der nächst höhere wert, was ist das Minimum, etc, sehr schnell ausgeführt werden. Das Hinzufügen/Entfernen von Daten ist dann im Vergleich zu Hashtabellen langsamer, da der Baum Dabei umstrukturiert wird.

Hashsets sind nützlich, wenn du einfach nur willst, dass du die Daten schnell hinzugefügt/entfernt/abgerufen werden (das Läuft nämlich normalerweise in Kosnstanter Zeit ab). Die Daten werden dann überhaupt nicht geordnet, weswegen die oben genannten Abfragen nicht effizient durchgeführt werden können.

KathaHohenfels 
Fragesteller
 22.04.2022, 19:06

Also TreeSets, wenn ich die Daten insofern sortiert haben will, dass ich schnell erkennen kann, was an der nächsthöheren/nächstgeringeren Stelle oder an der niedrigsten/höchsten Stelle ist?

Aber wenn ich es z.B. so implementiere:

TreeSet<String> ts = new TreeSet<String>();
ts.add("Willi");
ts.add("Paul");
ts.add("Heinz");
ts.add("Anton");
ts.add("Karl");
ts.add("Karl");
ts.add("Achim");

for (Iterator<String> it = ts.iterator(); it.hasNext();) {
     System.out.println(it.next());
}
System.out.println("Größe: " + ts.size()); // 6

Quelle: Javabeginners - TreeSet

...woher weiß ich dann, was von dem, was ich eingefügt habe, nun z.B. an der höchsten Stelle ist?

0
Jangler13  22.04.2022, 19:08
@KathaHohenfels

Strings werden normalerweise Lexiographisch geordnet (also wie bei einem Wörterbuch)

0
KathaHohenfels 
Fragesteller
 22.04.2022, 19:10
@Jangler13

das heißt wenn ich das erste Element wollen würde würde ich das im ABC an erster Stelle vorkommende erhalten, also "Achim"? Und was wenn ich statt Strings beispielsweise in das TreeSet ein TreeSet übergebe?

0
Jangler13  22.04.2022, 19:21
@KathaHohenfels

Es gibt in Java ja interfaces, die man bei Classes implementieren kann. Das ist einfach eine Menge von vorgegebenen Funktionen, die in der Klasse definiert werden müssen.

(Leider kenne ich mich da nicht allzu sehr aus)

Also ich bin mir nicht sicher was passiert wenn du TreeSets in TreeSets reintust. Es könnte sein, dass dann ein Fehler kommt.

0
Jangler13  22.04.2022, 19:22
@Jangler13

Also ich kenne Leider nur die Theoretischen Aspekte, nicht die aus der Praxis (also wie genau es in Java implement ist)

0
regex9  23.04.2022, 00:38
@KathaHohenfels

Die Einträge im TreeSet werden entweder nach ihrer natürlichen Ordnung sortiert (benutzerdefinierte Typen müssten das Comparable-Interface implementieren) oder du gibst am Anfang über ein Comparator-Objekt eine Sortierung vor:

Set<Integer> set = new TreeSet<>(new Comparator<Integer>() {
  @Override
  public int compare(Integer numberOne, Integer numberTwo) {
    // ...
  }
});

Oder kürzer:

Set<Integer> set = new TreeSet<>((numberOne, numberTwo) -> {
  // ...
});

Wenn du versuchst, Objekte in ein TreeSet einzufügen, die nicht miteinander vergleichbar sind (d.h. es gibt weder einen Comparator noch implementieren die Objekte das Comparable-Interface), erhältst du eine ClassCastException.

1
KathaHohenfels 
Fragesteller
 22.04.2022, 19:07

Das hier steht z.B. auf deiner Seite:

TreeSet maintains objects in Sorted order defined by either Comparable or Comparator method in Java. TreeSet elements are sorted in ascending order by default.

Und was bedeutet dass dann bei meinem Codebeispiel angewendet? Inwiefern ist das Hinzugefügte dann sortiert?

0
regex9  23.04.2022, 00:44
@KathaHohenfels

Ein Anwendungsbeispiel zum Vergleich:

import java.util.*;

public class Main {
  public static void main(String[] args) {
    Set<String> hashSet = new HashSet<>();
    fillSet(hashSet);
    Set<String> treeSet = new TreeSet<>();
    fillSet(treeSet);

    System.out.println("--- Hash Set: ----------");
    printSet(hashSet);

    System.out.println("--- Tree Set: ----------");
    printSet(treeSet);
  }

  private static void fillSet(Set<String> set) {
    set.add("Cloud");
    set.add("Roof");
    set.add("Skyscraper");
    set.add("Sunflower");
    set.add("Grass");
  }

  private static void printSet(Set<String> set) {
    for (String entry : set) {
      System.out.println(entry);
    }
  }
}

Bei wenigen Einträgen (z.B. drei) wirst du in beiden Fällen noch sortierte Ausgaben erhalten. Umso mehr Einträge ergänzt werden, umso deutlicher wird, dass das HashSet variabel sortiert bzw. die Einfügereihenfolge nicht beibehält. Das TreeSet hingegen sortiert wie erwartet nach Wert (bei Strings nach Alphabet).

2
KathaHohenfels 
Fragesteller
 24.04.2022, 12:37
@regex9

"Das TreeSet sortiert wie erwartet nach Wert". Was genau ist mit Wert gemeint? Wie würde es dann z.B. bei Zahlen sortieren oder bei Objekten?

0
Jangler13  24.04.2022, 12:56
@KathaHohenfels

Zahlen werden üblciher weise von Klein nach groß sortiert.

Bei Objekten hängt es davon ab, wie in deren Klasse das Comparable oder das Comparator Interface implementiert wurde

Zum Beispiel könnte es sein, dass du die Klasse "Auto" hast, in der Implementiert ist, dass die Objekte nach dem Attribut "Preis" sortiert werden.

1
KathaHohenfels 
Fragesteller
 22.04.2022, 19:09

Ufff ich war grad auf deinem Profil und du bist die erste Person die ich kennenlerne, die an meinem Geburtstag auch Geburtstag hat...also falls deine Angabe dort stimmt xD

1