TreeSet und Komparatoren

Underfaker

Bekanntes Mitglied
Hallo zusammen,

ich stehe im Moment vor einer Frage die ich mir bisher nicht so recht klar machen konnte.

Bei TreeSets ist für eine Sortierung eine compare-Methode zu implementieren, wenn man bspw eine umgekehrte Reihenfolge möchte (Oder man benutzt die Abkürzung).

Ich habe zwei Beispielprogramme bei denen ich mcih frage wieso ich bei dem einen ein neues Objekt?! dem TreeSet überge bei der Implementierung bei dem anderen jedoch nicht, die Frage lautet also wann muss/kann man das machen, wann nicht.

Erstes Programm Zeile 4 (hier wird ein neues Objekt (Neu SucheReverse()) beim Erzeugen übergeben):

Java:
 import java.util.*;
    class FruitTree {
    public static void main(String[] args){
        TreeSet obst=new TreeSet(new SucheReverse());
        obst.add("Kiwi");
        obst.add("Kirsche");
        obst.add("Ananas");
        obst.add("Zitrone");
        obst.add("Grapefruit");
        obst.add("Banane");
        obst.add("Kirsche");
        obst.add("Kiwi");
       
        Iterator it=obst.iterator();
        while(it.hasNext())
            System.out.println((String)it.next());
       
    }
   
}


class SucheReverse implements Comparator {
    public int compare(Object o1, Object o2)
    {
        return ((String)o2).compareTo((String)o1);
    }
}

Zeites Programm Zeile 27 (hier wird nichts übergeben):

Java:
import java.util.*;
class Student implements Comparable
{
//Attribute für Name und Matrikelnummer
public String name;
public int matrikel;
Student (String n, int m)
{
name = n;
matrikel = m;
}
public int compareTo(Object o)
{
if (matrikel > ((Student)o).matrikel)
return 1;
else if (matrikel == ((Student)o).matrikel)
return 0;
else
return -1;
}

}
class StudentTree
{
public static void main(String[] args){
//Neues TreeSet Objekt studi erzeugen
TreeSet<Student> studi = new TreeSet<Student>();
studi.add(new Student ("Paul Schmidt",562312));
studi.add(new Student ("Anna Müller",761232));
studi.add(new Student ("Heidi Unger",752312));
studi.add(new Student ("Peter Paffay",642312));
//TreeSet Objekt studi durchlaufen und für jeden Studenten
//Name und Matrikelnummer ausgeben

Iterator<Student> it = studi.iterator();
while (it.hasNext())
{

Student tmp = it.next();
System.out.println(tmp.name + " " + tmp.matrikel);
}
}
}


Ich hoffe es ist verständlich was ich meine.

Vielen Dank schonmal für eure Antworten. 🙂
 
Ein Blick in die API: TreeSet (Java Platform SE 6)
Zu FruitTree/Zeile 4:
TreeSet(Comparator<? super E> comparator)
Constructs a new, empty tree set, sorted according to the specified comparator.
Zu Student/Zeile 27:
TreeSet()
Constructs a new, empty tree set, sorted according to the natural ordering of its elements.

Mit "natural ordering of its elements" ist die die Sortierung gemeint, die durch compareTo angegeben wird.
 
Zuletzt bearbeitet von einem Moderator:
Also bedeutet das, dass es im zweiten Fall keinen Comparator zum übergeben gibt, da die natürliche Sortierung vorher gewerleistet wird, aber wie sortiert er die denn dann vorher, also in dieser Methode wird doch lediglich >0 <0 oder = 0 zurückgegeben, wer nimmt dort dieser Werte auf um die Reihenfolge zu kennen?

Wie müsste man das zweite programm ändern damit ich das so mache wie im ersten?
 
Ich glaube ich habe grade ein entscheidenes Detail gefunden.

"Comparable" bedeutet wohl, Objekte werden natürlich vergleichbar gemacht.

"Comparator" definiert dann eine konkrete Reihenfolge.

Ist mir nicht aufgefallen, also wegen comparable wird die natürliche Reihenfolge geändert, deswegen kann man auch keinen Comparator übergeben, denn naja es gibt keinen 🙂
 
Student implementiert das Interface Comparable und damit die Methode compareTo. Es ist also sichergestellt, dass auf allen Objekten der Klasse Student compareTo aufgerufen werden kann. compareTo wird beim Sortieren aufgerufen

Wie müsste man das zweite programm ändern damit ich das so mache wie im ersten?

Im zweiten Programm müsstest du den gleichen Konstruktor wie im ersten aufrufen. Die Konstruktoren sind überladen (hoffentlich der richtige Begriff)

Also bedeutet das, dass es im zweiten Fall keinen Comparator zum übergeben gibt, da die natürliche Sortierung vorher gewerleistet wird, aber wie sortiert er die denn dann vorher, also in dieser Methode wird doch lediglich >0 <0 oder = 0 zurückgegeben, wer nimmt dort dieser Werte auf um die Reihenfolge zu kennen?

Eine Sortierung besteht aus einer Menge von Vergleichsoperationen, dafür wird der Rückgabewert der Methode compareTo gebraucht (ohne jetzt näher ins Detail zu gehen)
 
Ja ich denke nachdem mir der Unterschied zwischen den Begriffen aufgefallen ist, weiß ich nun ungefähr was Sache ist, danke für deine Bemühungen. 🙂
 
Ich glaube ich habe grade ein entscheidenes Detail gefunden.

"Comparable" bedeutet wohl, Objekte werden natürlich vergleichbar gemacht.

"Comparator" definiert dann eine konkrete Reihenfolge.

Ist mir nicht aufgefallen, also wegen comparable wird die natürliche Reihenfolge geändert, deswegen kann man auch keinen Comparator übergeben, denn naja es gibt keinen 🙂

Comparable bedeutete einfach vergleichbar. Objekte Comparable implementierender Klassen können miteinander verglichen werden (oder heißt das vergleicht?)

Comparator-Implementierungen beinhalten hingegen eine Methode, die zwei Objekte/Elemente entgegen nimmt und sie miteinander vergleicht
 

Zurück
Oben