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. :)
 
H

hüteüberhüte

Gast
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:

Underfaker

Bekanntes Mitglied
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?
 

Underfaker

Bekanntes Mitglied
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 :)
 
H

hüteüberhüte

Gast
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)
 

Underfaker

Bekanntes Mitglied
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. :)
 
H

hüteüberhüte

Gast
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
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Objete von Polygon mit TreeSet verwalten Java Basics - Anfänger-Themen 1
N Einzelne Werte aus einem TreeSet auslesen Java Basics - Anfänger-Themen 2
R TreeSet Zugriff aus anderer Klasse Java Basics - Anfänger-Themen 8
J Klassen HashSet, TreeSet: unregelmäßige Zahlenreihen beim Befüllen Java Basics - Anfänger-Themen 7
J Objecte in TreeSet einfügen klappt nicht Java Basics - Anfänger-Themen 5
G Laufzeit/ O/Θ-Notation einer Treeset Methode Java Basics - Anfänger-Themen 0
J TreeSet mit compareTo sortieren Java Basics - Anfänger-Themen 2
W Add zu TreeSet Probleme Java Basics - Anfänger-Themen 6
T TreeSet sortiert in ein anderes kopieren Java Basics - Anfänger-Themen 2
Todesbote Treeset - Wenn bestimmtes Objekt vorkommt Counter erhöhen Java Basics - Anfänger-Themen 6
Todesbote Map<String, Treeset> aus Treeset bestimmten Wert auslesen Java Basics - Anfänger-Themen 4
A Treeset per For-Schleife durchlaufen Java Basics - Anfänger-Themen 2
B Object "Method" in TreeSet, Fehler beim Vergleichen/Comparable Java Basics - Anfänger-Themen 9
B Lotto mittels TreeSet Java Basics - Anfänger-Themen 3
D Datentypen TreeSet aus einer List<String[]> befüllen Java Basics - Anfänger-Themen 18
M Treeset sortieren und ausgeben Java Basics - Anfänger-Themen 17
K TreeSet Sortieren Java Basics - Anfänger-Themen 6
E TreeSet Element löschen Java Basics - Anfänger-Themen 9
T treeSet durchsuchen Java Basics - Anfänger-Themen 2
R Sortieren TreeSet Java Basics - Anfänger-Themen 2
G HashSet vs. TreeSet Java Basics - Anfänger-Themen 3
M Problem beim Löschen des ersten Eintrags einer TreeSet Java Basics - Anfänger-Themen 3
J TreeSet methode Remove Java Basics - Anfänger-Themen 13
M TreeSet sortieren Java Basics - Anfänger-Themen 13
C Maximal-Anzahl von Objekten in TreeSet Java Basics - Anfänger-Themen 7
S TreeSet und StringTokenizer Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben