# compareTo Liste sortieren



## real (14. Nov 2010)

Hallo!

Ich versteh die compareTo Funktion noch nicht ganz. Hab schon im Forum gesucht, und diese zwei Methoden gefunden. Meine Frage nun, warum sind die beiden Methoden gleich?

Was bewirkt die compareTo Funktion eigentlich? (Ich habe in meinem Programm eine Array Liste, die ich abfallend sortieren soll und dies mach ich mit dem compareTo. Nur hab ich den Hintergrund der Funktion noch nicht ganz verstanden. Kann es sein, dass durch das compareTo die Array Liste so verändert wird, dass das Array 1 hinter das Array 2 gestellt wird, wenn Array 1 kleiner als Array 2 ist?)

Bitte um Erklärung! Vielen Dank!

Nun der Quellcode:


```
public int compareTo(Student o) {
        if ( (this.age == o.getAge()) ) {
            return 0;
        } else if ( this.age> o.getAge() ) {
            return 1;
        } else {
            return -1;
        }
 
    }
```

geht auch so


```
public int compareTo(Student o) {
      return  this.age - o.getAge() 
    }
```


----------



## eRaaaa (14. Nov 2010)

An sich geht die zweite Variante auch ja, man muss nur bei Überlaufen aufpassen, in den meisten Fällen sind die Werte aber nicht zu unterschiedlich.
Zu deinen anderen Fragen, findest du sicherlich etwas in deinen Java-Büchern, oder du liest das Kapitel in der Insel:
Galileo Computing :: Java ist auch eine Insel (8. Auflage) – 12.4 Vergleichen von Objekten

Wenn du dann noch konkrete Fragen hast, kannst du die ja nochmal aufzeigen


----------



## real (14. Nov 2010)

Danke für die schnelle Antwort!

Meine konkrete Frage: In der Main Methode nutze ich die Funktion Collections.sort, da ich ja meine Arrays aufsteigend sortieren möchte. Für was muss ich dann überhaupt die Funktion compareTo in der anderen Klasse deklarieren? (ich sehe noch keinen Zusammenhang zwischen den beiden Funktionen!)

Bitte um eine Erklärung!


----------



## eRaaaa (14. Nov 2010)

Die Methode sort muss ja schließlich wissen wie sie sortieren soll. Woher soll die Methode denn wissen, welcher Student nun eine höhere Ordnung hat als ein anderer? Könnte ja schließlich sein, dass du sagst, die Matrikelnr ist entscheidend, das Alter, die Zensur or whatever..und dann eben auch aufsteigend/absteigend etc.  
compareTo gibt eben eine natürliche Ordnung vor, wenn du noch andere definieren willst wäre der Comparator eine Alternative.


----------



## Marcinek (14. Nov 2010)

Du hast 2 Elemente A und B

Wenn du das alphabetisch sorierst, dann kommt B nach A

compareTO()

entscheidet ob das A links oder Rechts von B liegt oder ob es die gleiche Position hat.

Das geht nun für Strings  nach dem alphabet.

Aber du kannst auch komplexe Datenstrukturen haben, wie Person mit name und alter.

Wenn du nun sagen willst, das nach alter sortiert werden soll, dann muss Person das Interface Compareable implementierten. Und da drin muss man sagen wann Person 1 vor Person 2 steht.


----------



## moccajoghurt (14. Nov 2010)

Mit dieser compareTO()-Funktion wird das Alter deines im Paramterübergeben Objektes mit dem Alter des Objektes, mit dem du die Funktion aufrufst verglichen.

Entweder du erhälst (bei Gleichheit) den Wert 0, den Wert 1 (wenn das aktuelle Objekt größer, als das übergebene ist), oder den Wert -1 (wenn das übergebene Objekt äter ist).

Mithilfe dieses Vergleiches, kannst du für jedes Student-Objekt herausfinden ob es älter als ein x-beliebiges ist. Um dann letztlich zu sortieren, brauchst du nochmal eine extra Schleife, die das mithilfe deiner Funktion tut.


----------

