Fargen über Sortierreihenfolge

Annalena123

Aktives Mitglied
Ich muss die Methode compareTo() implementieren , Anscheinend ist es nicht richtig, was ich geschrieben habe ! Kann jemand bitte mir dabei helfen ?
Um eine eigene Sortierreihenfolge vorzugeben, sollte die Klasse Buch das Java-eigene Interface Comparable<Buch> implementieren.1 Das Interface deklariert lediglich eine Methode compareTo(Buch b), die einen int zurückgibt.

Das erwartete Verhalten der Methode compareTo ist im Methodenkommentar definiert. Deine Implementation soll die dort genannten Anforderungen erfüllen.
die Anforderung :
Code:
/**
    Die Methode folgt dem im Interface Comparable
    beschriebenen Verhalten.
    
    Wird die Methode an Buch a aufgerufen und Buch b übergeben,
    gilt für den Rückgabewert n:
        n < 0, wenn a in der Reihenfolge vor b steht
        n > 0, wenn a in der Reihenfolge nach b steht
        n == 0, wenn a und b für die Sortierung als
            gleich zu betrachten sind
        Die Methode ist transitiv (a < b < c => a < c)
            und das Vorzeichen symmetrisch (a < b => b > a).
        Die Methode muss den Fall null nicht behandeln.

    Sie implementiert die von der Kundin gewünschte Sortierreihenfolge.
    Je länger ein Buch in der Sammlung ist, desto
    früher steht es in der Liste.
    Zwischen Büchern, die im gleichen Jahr angeschafft wurden,
    wird aufsteigend nach der ISBN sortiert.
*/
public int compareTo(Buch b)

{
 if(this.gibKaufjahr()- b.gibKaufjahr()==0){
    
     return (int) this.gibISBN()-b.gibISBN();
 }
   return this.gibKaufjahr()- b.gibKaufjahr();
}
class Buch :
Java:
public class Buch implements Comparable<Buch>
{
    private final long _isbn;
    private final String _autor;
    private final String _titel;
    private final int _preis;
    private final int _kaufjahr;

    /**
     * Erzeugt ein Buch, welches der Sammlung hinzugefuegt
     * werden soll.
     *
     * @param isbn ISBN des Buches
     * @param autor Autor:in des Buches
     * @param titel Titel des Buches
     * @param preis Preis in Eurocent, zu dem das Buch
     *              gekauft wurde
     * @param kaufjahr Jahr, in dem das Buch gekauft wurde
     */
    public Buch (long isbn, String autor, String titel,
                 int preis, int kaufjahr)
    {
        _isbn = isbn;
        _autor = autor;
        _titel = titel;
        _preis = preis;
        _kaufjahr = kaufjahr;
    }

    /**
     * Gibt die ISBN des Buches zurueck.
     * @return ISBN
     */
    public long gibISBN()
    {
        return _isbn;
    }

    /**
     * Gibt die Autor:in des Buches zurueck.
     * @return Autor:in des Buches
     */
    public String gibAutor()
    {
        return _autor;
    }

    /**
     * Gibt den Titel des Buches zurueck.
     * @return Titel des Buches
     */
    public String gibTitel()
    {
        return _titel;
    }

    /**
     * Gibt den Preis zurueck, zu dem das Buch gekauft wurde.
     * @return Kaufpreis in Eurocent
     */
    public int gibPreis()
    {
        return _preis;
    }

    /**
     * Gibt das Jahr zurueck, in dem das Buch gekauft wurde.
     * @return Kaufjahr
     */
    public int gibKaufjahr()
    {
        return _kaufjahr;
    }

    
    // hier wird dein Code eingefügt
}
 

httpdigest

Top Contributor
Ich sehe nur das Problem, wie du die ISBNs voneinander abziehst.
Das dürfte so gar nicht kompilieren, weil du zuerst die this.isbn nach int castest, dann die b.isbn (als long) davon abziehst.
Das Ergebnis dürfte dann wieder ein long sein, was zu einem Compilefehler führen wird, weil die Methode ja ein int zurückliefert.
Hinweis: Ein Cast bindet enger als ein binärer Operator wie etwa die Subtraktion!
Du solltest den Ausdruck also klammern: return (int) (this.gibISBN()-b.gibISBN());

Außerdem sind solche Subtraktionen aber nicht sicher für Überläufe bzw. Grenzfälle. Gerade, weil du hier zwei longs hast, das Ergebnis aber als int brauchst.
Siehe als Beispiel auch die JDK8 Implementierung von Long.compareTo(long): http://hg.openjdk.java.net/jdk8/jdk...8/src/share/classes/java/lang/Long.java#l1230

Hier wird explizit nicht subtrahiert, wegen der möglichen Überläufe.
 

Annalena123

Aktives Mitglied
Ich sehe nur das Problem, wie du die ISBNs voneinander abziehst.
Das dürfte so gar nicht kompilieren, weil du zuerst die this.isbn nach int castest, dann die b.isbn (als long) davon abziehst.
Das Ergebnis dürfte dann wieder ein long sein, was zu einem Compilefehler führen wird, weil die Methode ja ein int zurückliefert.
Hinweis: Ein Cast bindet enger als ein binärer Operator wie etwa die Subtraktion!
Du solltest den Ausdruck also klammern: return (int) (this.gibISBN()-b.gibISBN());

Außerdem sind solche Subtraktionen aber nicht sicher für Überläufe bzw. Grenzfälle. Gerade, weil du hier zwei longs hast, das Ergebnis aber als int brauchst.
Siehe als Beispiel auch die JDK8 Implementierung von Long.compareTo(long): http://hg.openjdk.java.net/jdk8/jdk...8/src/share/classes/java/lang/Long.java#l1230

Hier wird explizit nicht subtrahiert, wegen der möglichen Überläufe.
ich habe den Code geändert aber konnte nur einen Test bestehen , die andere Tests wurden nicht bestanden !Was muss ich noch beachten ?
public int compareTo(Buch b)

{

if(this.gibKaufjahr()- b.gibKaufjahr()==0){

if (this.gibISBN()>b.gibISBN()){
return (int)b.gibISBN();
}else{
return (int) this.gibISBN();
}

}else{
return (int) ( this.gibKaufjahr()-b.gibKaufjahr());

}
 

Anhänge

  • error111.PNG
    error111.PNG
    31,6 KB · Aufrufe: 1

httpdigest

Top Contributor
Java:
if (this.gibISBN() > b.gibISBN()){
  return (int) b.gibISBN();
} else {
  return (int) this.gibISBN();
}
Das ist ja noch falscher als vorher. Weiterhin: Man kann nicht einfach einen long in einen int casten und dann erwarten, dass es ein sinnvoller Wert für ein compareTo ist.
 

KonradN

Super-Moderator
Mitarbeiter
Schau Dir doch einmal an, was Du da zurück gibst. Und dann schau Dir an, was zurück gegeben werden soll!

Du kannst sowas doch einmal durchspielen. Spiel ein Beispiel durch und schau, was zurück gegeben wird. Und schau Dir den Kommentar der Methode an, was zurück gegeben werden soll!
 

Annalena123

Aktives Mitglied
Java:
if (this.gibISBN() > b.gibISBN()){
  return (int) b.gibISBN();
} else {
  return (int) this.gibISBN();
}
Das ist ja noch falscher als vorher. Weiterhin: Man kann nicht einfach einen long in einen int casten und dann erwarten, dass es ein sinnvoller Wert für ein compareTo ist.
der Link , den du geschickt hast war ein bisschen kompliziert für mich , kannst Du bitte erklären wie ich mit long vergleichen kann ?oder hast du ein anderes Beispiel , das einfacher ist ?
 

KonradN

Super-Moderator
Mitarbeiter
Du hast die notwendige Dokumentation gegeben:
Wird die Methode an Buch a aufgerufen und Buch b übergeben,
gilt für den Rückgabewert n:
n < 0, wenn a in der Reihenfolge vor b steht
n > 0, wenn a in der Reihenfolge nach b steht
n == 0, wenn a und b für die Sortierung als
gleich zu betrachten sind
Die Methode ist transitiv (a < b < c => a < c)
und das Vorzeichen symmetrisch (a < b => b > a).
Die Methode muss den Fall null nicht behandeln.

Du kannst also irgend einen Wert < 0 bzw. irgend einen Wert > 0 zurück geben.

Wenn also die ISBN des Buches, auf dem compareTo aufgerufen wurde, kleiner istm, dann muss ein Wert < 0 zurück gegeben werden.
Die ISBN selbst ist aber nicht (zwingend) < 0. Fällt Dir evtl. irgend eine Zahl ein, die kleiner 0 ist? Irgend eine! Die könntest Du ja dann nehmen.
 

KonradN

Super-Moderator
Mitarbeiter
Ich verstehe diese Herangehensweise nicht und mir fehlt da total das Verständnis.

Es ist eine einfache Aufgabe. Diese einfachen Aufgaben dienen dazu, zu begreifen, wie man zu einer Lösung kommt. Und der Lösungsweg ist aus meiner Sicht am Anfang eben nicht: Ich kopiere mir einfach irgendwo etwas.

Und die Lösung hattest Du doch schon fast! D
In erster Linie stimmte die Rückgabe nicht und die Prüfung auf Gleichheit fehlte.

Java:
if (this.gibISBN() < b.gibISBN()){
  return -1;
}

if (this.gibISBN() == b.gibISBN()){
  return 0;
}

return 1;

Das ist übrigens das, was Du da jetzt gefunden hast - nur eben mit ternärem Operator statt if Anweisungen.

Und genau das ist die Erwartungshaltung. Aus der Aufgabe soll genau dies erarbeitet werden.

Aber egal - mich freut, dass Du eine Lösung für die Aufagbe hast und dass wir Dich spätetsens bei der nächsten Aufgabe hier wieder sehen werden.
 

Neue Themen


Oben