# TreeSet sortieren



## Muminek (8. Feb 2007)

Hallo zusammen,

ich habe ein TreeSet aus folgenden Objekten:


```
public class RecipientMailInfo implements Comparable {

	private String fullName;

	private String email;

	private String  firstName;

	private String  lastName;

	public String getFirstName() {
		return firstName;
	}

	public void setFirstName(String firstName) {
		this.firstName = firstName;
	}

	public String getLastName() {
		return lastName;
	}

	public void setLastName(String lastName) {
		this.lastName = lastName;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public String getFullName() {
		return fullName;
	}

	public void setFullName(String fullName) {
		this.fullName = fullName;
	}

	public int compareTo(Object recipientmailInfo) {
		RecipientMailInfo recipientMailInfo = (RecipientMailInfo) recipientmailInfo;

		final int EQUAL = 0;

		if (this == recipientMailInfo) {
		return EQUAL;
		}
		int comparison = 0;

		comparison = this.firstName.compareTo(recipientMailInfo.firstName);
		if (comparison != EQUAL) {
		return comparison;
		}

		comparison = this.lastName.compareTo(recipientMailInfo.lastName);
		if (comparison != EQUAL) {
		return comparison;
		}

		comparison = this.email.compareTo(recipientMailInfo.email);
		if (comparison != EQUAL) {
		return comparison;
		}

		comparison = this.fullName.compareTo(recipientMailInfo.fullName);
		if (comparison != EQUAL) {
		return comparison;
		}

		return EQUAL;

		}

}
```

Ich musste dazu die compareTO Methode überschreiben. Nun möchte ich das TreeSet nach dem Attribut 
Fullname sortieren. Nur die frage ist wie? Für jeden Tipp wäre ich dankbar.


MFG


----------



## Gast (8. Feb 2007)

Schau dir am besten mal die API an Treeset

du solltest die compareTo methode anständig überschreiben


----------



## Muminek (8. Feb 2007)

Ja, schon aber das erschließt sich für mich daraus nicht wirklich.


----------



## SlaterB (8. Feb 2007)

was möchtest du denn tun, compareTo ändern
oder eine zweite Sortierreihenfolge definieren?

dann musst du ein zweites TreeSet mit einem Comparator-Objekt erstellen,
das Comparator-Objekt legt die Reihenfolge fest,
nur wenn keins da ist, wird auf das normale compareTo zurückgegriffen


----------



## Muminek (8. Feb 2007)

Wenn es möglich ist compareTo so zu ändern das das TreeSet nach fullname sortiert wird, wäre dies die Lösung die mir am liebsten ist.


----------



## Marco13 (8. Feb 2007)

```
public int compareTo(Object recipientmailInfo) {
      RecipientMailInfo recipientMailInfo = (RecipientMailInfo) recipientmailInfo;
      return this.fullName.compareTo(recipientMailInfo.fullName);
}
```
 ???:L


----------



## Muminek (8. Feb 2007)

Danke für die Idee. Diese Möglichkeit funktioniert jedoch leider nicht. 
Die Objekte werden nicht nach fullname sortiert sondern weiter einfach 
nach der Reihenfolge in der sie hinzugefügt wurden.


----------



## SlaterB (8. Feb 2007)

```
import java.util.Iterator;
import java.util.TreeSet;

public class Test
{

    private class Person
        implements Comparable
    {

        String name;

        public Person(String name)
        {
            this.name = name;
        }

        public int compareTo(Object o)
        {
            return this.name.compareTo(((Person)o).name);
        }

        public String toString()
        {
            return this.name;
        }


    }


    public Test()
    {
        Person p1 = new Person("aaaaa");
        Person p2 = new Person("xxxxx");
        Person p3 = new Person("ccccc");
        Person p4 = new Person("zzzzz");

        TreeSet t = new TreeSet();
        t.add(p1);
        t.add(p2);
        t.add(p3);
        t.add(p4);

        Iterator iter = t.iterator();
        while (iter.hasNext())
        {
            System.out.println(iter.next());
        }


    }

    public static void main(String[] args)
        throws Exception

    {
        new Test();

    }
}
```

geht..


----------



## Muminek (9. Feb 2007)

Ja wenn ich normal Objekte mit einem Attribut String übergeben funktioniert dies ja auch einwand frei doch mit meinen Empfängern habe ich das Problem dass ich nicht weiß wie sie sortiert werden mit kommt es so vor als würden sie einfach geaddet werden nach einander


----------



## SlaterB (9. Feb 2007)

du kannst auch mal in compareTo ne Ausgabe reinschreiben

System.out.println("vergleiche nun meinen Name: "+..+" mit anderem Namen: "+..);

wenn solche Ausgaben gar nicht erscheinen oder mit leeren Namen,
dann hast du paar Hinweise, was schieflaufen könnte,

dass es bei dir nicht geht kann an tausend Sachen liegen,
dass kann hier niemand erraten,


----------



## Muminek (9. Feb 2007)

Hm...

ich glaube du hast die Problematik nicht ganz erkannt.
alles Funktioniert einwandfrei. Es läuft nix schief.
Die in das TreeSet geladenen Objecte werden nicht 
geordnet...deswegen heißt das Thema ja auch TreeSet sortieren
und nicht mein TreeSet funktioniert nicht...


----------



## SlaterB (9. Feb 2007)

nun, so funktioniert aber ein TreeSet?! 
ein TreeSet ist eine Datenstruktur, die Objekte sortiert ablegt,
was ist denn sonst ein TreeSet?

TreeSet bietet übrigens (soweit ich das sehe) keine Operation wie sort/ resort,
wenn die Objekte bereits in einem Set drin sind und sich dann ihr Name ändert,
dann musst du das TreeSet komplett neu aufbauen


anders eine Liste wie ArrayList,
die kannst du mit Collections.sort jederzeit neu sortieren lassen


----------



## Muminek (9. Feb 2007)

Also wenn man ein String im TreeSet ablegt dann wird dieser alphabetisch eingeordnet! 
Warum sollte man nun die compareTo Methde nicht so umschreiben das der Sortier-Algorhytmus
sich auf ein Wert im Object bezieht??


----------



## SlaterB (9. Feb 2007)

ein String wird sortiert abgelegt wie auch jedes andere Objekt, das Comparable implementiert,

> Warum sollte man nun die compareTo Methde nicht so umschreiben das der Sortier-Algorhytmus sich auf ein Wert im Object bezieht??
klar kann man die so umschreiben, wer bestreitet das?

warum dein RecipientMailInfo.compareTo nicht geht weiß ich nicht, was fragst du das mich? 
ich habe dir ein Beispiel gepostet wie es geht,

wenn dein Code aber noch aus 1000 anderen Zeilen besteht,
dann können die da reinpfuschen, da kann niemand hellsehen, wie gesagt

dein comparableTo sieht aus der Ferne betrachtet gut aus,
zum dritten Mal der Aufruf: baue System.out.println ein,
vergleiche vielleicht erst mal zwei einzelne Objekte mit vorgegebenen Namen (nennt sich TESTEN),

die richtige Größe für ein Objekt mit compareTo ist anfangs

```
private class Person 
        implements Comparable 
    { 

        String name; 

        public Person(String name) 
        { 
            this.name = name; 
        } 

        public int compareTo(Object o) 
        { 
            return this.name.compareTo(((Person)o).name); 
        } 

        public String toString() 
        { 
            return this.name; 
        } 


    }
```
alle anderen Exemplarvariablen/ Konstruktoren stören nur
usw.

-> klein anfangen, 
nicht eine neue Änderung in ein riesiges Programm reinwerfen und dann rätseln warum es nicht geht..


----------

