Objekte miteinander vergleichen

Moritz1234

Mitglied
hallo, ich möchte in meinem Code zwei Objekte miteinander vergleichen also inhaltlich ob sie die selben Zahlen haben bspw. aber ich bekomme hier ständig ein false raus. Kann mir jemand sagen was ich falsch mache ? Danke im Voraus!
Java:
  public boolean compare(Fraction m) {  //vergleicht zwei Brüche aufgrund ihrer Zahlenwerte

        if  (this.numerator == m.getNumerator()) {
            return true;
        } else {
            return false;
    }

}


    public static void main(String[] args) {

        Fraction a = new Fraction(5,5);
        Fraction b = new Fraction(5,5);

     
    
        System.out.println( a.compare(b));
    }
}
 
Die Methode muss überschrieben werden.
Da jede Klasse von Object abgeleitet ist werden toString, equals, etc. geerbt. Wenn du eine neue Klasse schreibst und die equals Methode nutzen möchtest muss sie überschrieben werden!
 
Habe es schon mit equals() versucht aber das wird rot angezeigt. Geht das nicht nur auf Strings?
Nein.

Ich dachte, Du willst zwei Objekte mit == vergleichen, das wäre falsch, weil man Objekt inhaltlich per equals miteinander vergleicht. Du kannst aber ruhig die compare-Methode lassen.

Wenn numerator und denominator primitive Werte sind (z. B. Datentyp int), wäre die equals-Methode z. B.
Java:
@Override
public boolean equals(Object o) {
    if (o == null || o == this || !(o instanceof Fraction)) {
        return o == this;
    }

    Fraction f = (Fraction) o;
    return numerator == f.numerator && denominator == f.denominator;
}

@Override
public int hashCode() {
    return 17+f.numerator*5+13*denominator;
}
 
Also ich hab das jetzt so versucht und das Programm gibt mir ständig false zurück. Kann mir jemand sagen woran das liegt? Das in den Parameter übergebene Objekt m wird mit dem Objekt verglichen, auf dem die Methode aufgerufen wird (die beiden Fraction-Objekte inhaltlich gleich).
Ich prüfe in der Methode als erstes mit dem instanceof-Operator, ob obj eine Instanz der Klasse Fraction ist. Aber bekomme immer wieder false..







Code:
    @Override
    public boolean equals(Object m){
        if(m instanceof Fraction){
            Fraction p = (Fraction) m;
            return (numerator == p.numerator) && (denominator == p.denominator);
        }
        else{
            return false;
        }
    }







    public static void main(String[] args) {

        Fraction a = new Fraction(5,5);
        Fraction b = new Fraction(5,5);

  
        System.out.println(a.equals(b));
    }
}
 
Mich würde trotzdem mal interessieren warum jetzt der Eingangcode des TO nicht funktioniert hat. Für mich sieht das alles richtig aus

Einzige was mit einfällt. Die compare bzw. equals methode ist gar nicht Teil der Fraction Klasse und deshalb wird dort die Standard Methode genommen
 
Kopier mal die gesamte Fraction Klasse rein.
Java:
public class Fraction {

    private int numerator;
    private int denominator;

    public Fraction(int numerator, int denominator) {
        this.numerator = numerator;
        this.denominator = denominator;
    }

    public Fraction(int denominator) {
        this(1, denominator);
    }

    public void reduce() {

        int z, n, r;

        z = this.numerator;
        n = this.denominator;
        r = z % n;
        while (r > 0) {
            z = n;
            n = r;
            r = z % n;
        }

        this.numerator = this.numerator / n;
        this.denominator = this.denominator / n;
    }

    public void printFraction() {

        System.out.println(this.numerator + "/" + this.denominator);

    }

    public void printFractionReduced() {
        reduce();
        printFraction();

    }

    public void multiply(Fraction m) {

        this.numerator = m.getNumerator() * this.numerator;
        this.denominator = m.getDenominator() * this.denominator;


    }

    public void divide(Fraction m)
    {
        this.numerator= this.numerator * m.getDenominator() ;
        this.denominator= this.denominator * m.getNumerator() ;
    }

    public void add(Fraction m) {
 
        this.numerator = this.numerator * m.getDenominator() + m.getNumerator() * this.denominator;
        this.denominator = this.denominator * m.getDenominator();


    }

    public void setDenominator(int denominator) {
        this.denominator = denominator;
    }

    public void setNumerator(int numerator) {
        this.numerator = numerator;
    }

    public int getDenominator() {
        return this.denominator;
    }

    public int getNumerator() {
        return this.numerator;
    }


    public boolean equals(Fraction m){
        if(m instanceof Fraction){
            Fraction p = (Fraction) m;
            return (numerator == p.numerator) && (denominator == p.denominator);
        }
        else{
            return false;
        }
    }







    public static void main(String[] args) {

        Fraction a = new Fraction(5,5);
        Fraction b = new Fraction(5,5);

        a.multiply(b);
        System.out.println(a.equals(b));
    }
}
 
Wenn ich deine Main Methode in
Code:
    public static void main(String[] args) {

        Fraction a = new Fraction(5,5);
        Fraction b = new Fraction(5,5);

        System.out.println(a.equals(b));
    }
Ändere kommt true raus.

Das bei dem Code oben vor dir kein True rauskommt ist ja wohl klar.

Wenn, kopiere bitte den gesamten fehlerhaften Code rein - und nicht Bruchstücke verschiedener Varianten. Die Main Methode, die angeblich false liefert ist nicht die, die du gerade gepostet hast.
 
Ich ve
Wenn ich deine Main Methode in
Code:
    public static void main(String[] args) {

        Fraction a = new Fraction(5,5);
        Fraction b = new Fraction(5,5);

        System.out.println(a.equals(b));
    }
Ändere kommt true raus.

Das bei dem Code oben vor dir kein True rauskommt ist ja wohl klar.

Wenn, kopiere bitte den gesamten fehlerhaften Code rein - und nicht Bruchstücke verschiedener Varianten. Die Main Methode, die angeblich false liefert ist nicht die, die du gerade gepostet hast.
Ich verstehe nicht ganz wo der fehler lag oder liegt..
 
Du schreibst vor das equals in deiner Methode noch a.multiply(b)

Und dann sind die Werte natürlich nicht mehr gleich a ist dann 25/25 und b weiterhin 5/5.
 
equals sollte auch das equals von Object überschreiben, d.h. Argument ist ein Object und kein Fraction.

Das ist hier aber egal, da du ja Fraction Instanzen hast. Aber wenn du nicht equals überschreibst, dann musst du nicht prüfen, ob das Argument eine Instanz von Fraction ist, da ja das Argument schon vom Typ Fraction ist.
 

Zurück
Oben