compareTo() überschreiben - Problem

  • Themenstarter Themenstarter squeezer
  • Beginndatum Beginndatum
S

squeezer

Gast
Hallo zusammen,

ich hätte mal kleines Problemchen mit dem überschreiben der compereTo()-Methode. Hier mein Code:

Java:
public class Pferd implements Comparable<Pferd> {
	
	//Variablen
	private String name;
	private int anzHufe;
	private int alter;
	
	//Konstruktor mit Parametern
	public Pferd (String name, int anzHufe, int alter) {
		this.name = name;
		this.anzHufe = anzHufe;
		this.alter = alter;
	}
	
	//Konstruktor ohne Parameter	
	public Pferd () {}
	
	public int getAlter () {
		return this.alter;
	}
	
	//toString() überschreiben
	public String toString(){
		String rueckgabe = "Name: " + name + " Alter: " + alter + " Anzahl Hufe: "+ anzHufe;
		return rueckgabe;		
	}
	

	//compareTo() überschreiben
	public int compareTo(Pferd p) {
	
		if (this.getAlter() == p.getAlter()) {
			return 0;
		}
		
		if (this.getAlter() < p.getAlter()) {
			return 1;
		}
		
		if (this.getAlter() < p.getAlter()) {
			return - 1;
		}
	}
}

Eclipse motzt nun folgendes bei der compareTo()-Methode: This method must return a result type of int.

Das verstehe ich nicht ganz. Ich gebe doch in den 3 if-Statements jeweils einen int zurück. Was genau ist das Problem?
 
Naja, es könnte doch sein dass getAlter() ne Zufallszahl zurückgibt. Dann kanns passieren dass deine Methode nichts zurückgibt. Du musst hier mit if-else if-else arbeiten.
 
Folgendes dürfte in diesem Fall für alle praktischen Belange reichen:
Java:
public int compareTo(Pferd p) {
	return this.getAlter() - p.getAlter();
}
Ark
 
Java:
return this.getAlter() == other.getAlter() ? 0 : this.getAlter() < other.getAlter() ? -1 : 1;

Stimmt die Semantik eigentlich? ;-) Kann mir das ohne ins Javadoc zu schauen bzw. mit Eclipse halt nie merken welches 1 und welches -1 zurückgeben muss.
 
Puh... jetzt bin ich komplett verwirrt.

Wenn ich dem 1. Vorschlag folge und folgendes mache:
Java:
//compareTo() überschreiben
	public int compareTo(Pferd p) {
	
		if (this.getAlter() == p.getAlter()) {
			return 0;
		}
		
		else if (this.getAlter() > p.getAlter()) {
			return 1;
		}
		
		else return - 1;
		
	}
Das funktioniert. Ich kann zwar nicht ganz nachvollziehen warum, aber es geht.

Java:
//compareTo() überschreiben
	public int compareTo(Pferd p) {
	
		return this.getAlter() - p.getAlter();
	}
Geht auch.

Meine Fragen noch:
Wenn doch bei meinen zuerst genannten if-Statements das Problem ist, dass die Methode evtl. nichts zurückgibt, falls getAlter() Zufallszahlen zurückgibt. Weshalb geht dann die zweite Variante? Dort könnten doch auch Zufallszahlen zurückkommen?

...ich glaube ich habe hier grundsätzlich irgendwas noch nicht verstanden.
 
Eine Meldung der Form "This method must return a result type of …" kommt dann, wenn aus Sicht des Parsers nicht für alle Fälle klar definiert ist, welchen Wert eine Methode, die nicht void ist, zurückgeben soll. In deinem Fall fehlte eine return-Anweisung, die du ja jetzt noch hinzugefügt hast. (Du kannst auch mit throw arbeiten, um den Parser zufriedenzustellen, aber das ist jetzt wohl nicht in deinem Sinne.)

Stell dir mal vor, alle if-Bedingungen in deinem ursprünglichen Code würden zu false ausgewertet. Welchen Wert sollte die Methode dann zurückgeben? 😉

Ark
 

Zurück
Oben