compareTo - Sortierung nach 2 Argumenten

Status
Nicht offen für weitere Antworten.

Flora

Mitglied
Hallo liebe Community,

nach erfolglosen Suchen im Internet glaube ich, dass ihr mir helfen könnt. Es geht um die Sortierung eines High Scores, der mit einer compareTo-Methode im LevelScore-Object sortiert werden soll. Und das zuerst nach der Levelnummer und dann nach den benötigten Schritten, die der Spieler getan hat.

Bei folgendem Code sortiert er allerdings nur nach der Levelnummer:

[HIGHLIGHT="Java"]public int compareTo(LevelScore compareObject)
{
if (this.getLevelNumber() == compareObject.getLevelNumber())
return 0;
else if (this.getLevelNumber() < compareObject.getLevelNumber())
return 1;


if (this.getLevelStepps() == compareObject.getLevelStepps())
return 0;
else if (this.getLevelStepps() > compareObject.getLevelStepps())
return -1;
return 1;
}[/HIGHLIGHT]

Wo ist der Fehler?

Vielen lieben Dank

die Flora
 
So geht's:
[HIGHLIGHT="Java"]public int compareTo(LevelScore compareObject) {
final int level1 = this.getLevelNumber();
final int level2 = compareObject.getLevelNumber();
if (level1 == level2) {
final int steps1 = this.getLevelStepps();
final int steps2 = compareObject.getLevelStepps();
return steps1 > steps2 ? -1 : (steps1 == steps2 ? 0 : 1);
} else if (level1 < level2) {
return 1;
} else {
return -1;
}
}[/HIGHLIGHT]
Anbei: "Steps" mit einem 'p'.

Ebenius
 
@Ebenius
[HIGHLIGHT="Java"]public int compareTo(LevelScore that) {
final int level1 = this.getLevelNumber();
final int level2 = that.getLevelNumber();
if (level1 == level2) {
return this.getLevelStepps() - that.getLevelStepps();
} else {
return level1 - level2 ;
}
}[/HIGHLIGHT]
 
@Ebenius
[HIGHLIGHT="Java"]public int compareTo(LevelScore that) {
final int level1 = this.getLevelNumber();
final int level2 = that.getLevelNumber();
if (level1 == level2) {
return this.getLevelStepps() - that.getLevelStepps();
} else {
return level1 - level2 ;
}
}[/HIGHLIGHT]
Liebe maki,

stimmt. Aber nur wenn Levels und Steps nicht negativ sein dürfen. Diese einschränkende Bedingung kam nirgends. Aus dem Grund hab ich den allgemeingültigen Integer-Vergleich genommen.

Anbei: Aus dem Eingangsbeitrag entnahm ich, dass der Comparator anders herum sortieren soll. Ob das stimmt weiß ich nicht.

Ebenius
 
wer so anfängt..

Code:
    public int compareTo(LevelScore that)
    {
        int c = this.getLevelNumber() - that.getLevelNumber();
        return c != 0 ? c : this.getLevelStepps() - that.getLevelStepps();
    }

> Aber nur wenn Levels und Steps nicht negativ sein dürfen.

hast du da ein Beispiel? ich meine, das müsste klappen

5 > 4 sowie 5-4 = 1
-3 > -4 sowie -3 - -4 = 1
 
Zuletzt bearbeitet von einem Moderator:
> Aber nur wenn Levels und Steps nicht negativ sein dürfen.

hast du da ein Beispiel? ich meine, das müsste klappen

5 > 4 sowie 5-4 = 1
-3 > -4 sowie -3 - -4 = 1
[HIGHLIGHT="Java"]System.out.println(Integer.MAX_VALUE / 2 - Integer.MIN_VALUE / 2);
System.out.println(Integer.MAX_VALUE - Integer.MIN_VALUE);[/HIGHLIGHT]
Gibt aus:
Code:
2147483647
-1
 
naja, das erinnert mich ja an manche Sonder-Zeitzonen-Berücksichtigung 😉
aber ok, kommt hin
 
Nachtrag: Integer.compareTo() machts auch so. Man sollte sich's lieber gleich angewöhnen. 😉
[HIGHLIGHT="Java"]/**
* Compares two <code>Integer</code> objects numerically.
*
* @param anotherInteger the <code>Integer</code> to be compared.
* @return the value <code>0</code> if this <code>Integer</code> is
* equal to the argument <code>Integer</code>; a value less than
* <code>0</code> if this <code>Integer</code> is numerically less
* than the argument <code>Integer</code>; and a value greater
* than <code>0</code> if this <code>Integer</code> is numerically
* greater than the argument <code>Integer</code> (signed
* comparison).
* @since 1.2
*/
public int compareTo(Integer anotherInteger) {
int thisVal = this.value;
int anotherVal = anotherInteger.value;
return (thisVal<anotherVal ? -1 : (thisVal==anotherVal ? 0 : 1));
}[/HIGHLIGHT]

Ebenius
 
@ice-breaker: na, auf die idee bin ich net gekommen. aber da hätt ich ja net den beispielcode einfach posten können, oder? jetzt funktioniert es auf jeden fall 🙂

@ebenius: ja, habe deinen code dann noch in der "sortierreihenfolge" umgedreht.

@rest: interessante beiträge noch^^
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben