Wann TreeSet verwenden(Java)?
Was sind die Vorteile eines TreeSets? Wann wird es verwendet? Wann wird besser ein Tree- wann besser ein Hashset verwendet?
lg Kath
1 Antwort
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.
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?
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).
"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?
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.
aaaah jetzt verstehe ich das, vielen Dank euch beiden!
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?
Strings werden normalerweise Lexiographisch geordnet (also wie bei einem Wörterbuch)
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?
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.
Also ich kenne Leider nur die Theoretischen Aspekte, nicht die aus der Praxis (also wie genau es in Java implement ist)
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.
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