Objekte aus 2 Klassen mit compareTo() vergleichen

Amstaff51

Mitglied
Grüzi,

ich habe zur Zeit ein leichtes Problem die Methode compareTo richtig anzuwenden. Es geht um folgendes:
Ich habe 2 Klassen (Dreieck und Kreis) in denen ich jeweils eine Methode inhalt() eingebaut habe, die mir den Flächeninhalt eines Dreiecks und Kreises ausgibt. Das Dreieck wird mit 3 Punkten aus der Klasse Punkt gefiniert und der Kreis aus einem Punkt + Radius.
Jetzt möchte ich in der abstrakten Klasse Figur die beiden Flächeninhalte mit einander vergleichen.

So sieht die vorgegeben Klasse Figur aus:
Java:
abstract class Figur implements Comparable {
abstract double inhalt();
abstract double umfang();
public int compareTo(Object object) {
...
}
}

Wie kann ich die Klasse vervollständigen damit es den Inhalt von Dreieck und Kreis vergleicht?

Java:
public int compareTo(Object object) {
return eck.inhalt().compareto(kreis.inhalt());
klappt leider nicht 😱
 
Zuletzt bearbeitet:
ich habe zur Zeit ein leichtes Problem die Methode compareTo richtig anzuwenden. Es geht um folgendes:
Ich habe 2 Klassen (Dreieck und Kreis) in denen ich jeweils eine Methode inhalt() eingebaut habe, die mir den Flächeninhalt eines Dreiecks und Kreises ausgibt. Das Dreieck wird mit 3 Punkten aus der Klasse Punkt gefiniert und der Kreis aus einem Punkt + Radius.
Jetzt möchte ich in der Klasse abstrakten Klasse Figur die beiden Flächeninhalte mit einander vergleichen.
Schon falsch.
[JAPI]Comparable[/JAPI] und damit
Code:
compareTo
sollen die natürliche Ordnung von Objekten widerspiegeln.
Äpfel und Birnen haben aber keine gemeinsame natürliche Ordnung, obwohl beides Obst ist.
Deshalb wir [JAPI]Comparable[/JAPI] nicht von abstracten Klassen, sondern nur von konkreten Klassen implementiert.

Um trotzdem Äpfel und Birnen zusammen mach Gewicht sortieren zu können benötigt man einen "exteren" Vergleich. So auch bei Dir.

Die Lösung heist also nicht [JAPI]Comparable[/JAPI], sondern [JAPI]Comparator[/JAPI].

bye
TT
 
Widerspruch gegen vielleicht allzu deutlich gelesenes Posting:
gegen Comparable spricht hier nicht mehr als allgemein auch,
wie man etwas sortieren will muss jeder selber wissen,

Natürlichkeit einer Ordnung ist auch nichts was man definieren/ festlegen kann,
es zeigt sich vor allem in seinen Eigenschaften, eben dass es direkt in der Klasse steht und nicht einem bestimmten Comparator X

es gibt auch Äpfel X und Y, die sich in Aussehen, Geschmack und sonstigen mehr unterscheiden können als bestimmte Apfel A und Birne B 😉

-----

zum Thema Bäume vor Wald:
> return eck.inhalt().compareto(kreis.inhalt());

double sind primitive Datentypen, da gibts normalerweise kein compareTo() (AutoBoxing aber zu bedenken),
da kann man z.B. mit Minus eine Differenz bilden
 
Zuletzt bearbeitet von einem Moderator:
Hi,

z.B.

Java:
@Override
    public int compareTo(Object o) {
//        throw new UnsupportedOperationException("Not supported yet.");
        if((int)FlaecheninhaltRechteck < (int)FlaecheninhaltDreieck)
        {
            return -1;
        
        }
        else if((int)FlaecheninhaltRechteck == (int)FlaecheninhaltDreieck)
        {
            return 0;
        }
        else if((int)FlaecheninhaltRechteck > (int)FlaecheninhaltDreieck)
        {
            return 1;
        }
        
    }

ungetestet 😀

Gruß
tschero
 
was genau der Rückgabe der Differenz zwischen den beiden entspricht wenn man sich nicht genau auf -1, 1 festlegt,
wobei es auch noch signum() gibt
 
Grundsätzlich würde ich Comparable auch eher vermeiden und einen Comparator vorziehen. Aber man könnte die Klasse Figur Comparable<Figur> implementieren lassen. Dann bekommst Du in der compareTo-Methode eine Figur als Parameter und kannst dort die Ergebnisse von inhalt() Vergleichen. Das schöne ist, dass in Subklassen keiner dieses Verhalten überschreiben und verfuddeln kann. Kann aber auch ein Nachteil sein...

[EDIT]Raw Comparable mit Object... Leute, Comparable ist nicht umsonst generisch![/EDIT]
 
was genau der Rückgabe der Differenz zwischen den beiden entspricht wenn man sich nicht genau auf -1, 1 festlegt,
wobei es auch noch signum() gibt

ähh, jetzt mal genug der kleinen Hinweise, auch von mir,
also:
> eck.inhalt().compareto(kreis.inhalt());

an Eck und Kreis muss und kann man gar nicht denken,
es gibt nur das eigene Objekt und das andere (Parameter), egal von welcher konkreten Subklasse,
von den beiden den Inhalt bestimmen, double

auf int casten ist nicht so gut wenn vielleicht 1.2 und 1.3 zu 1 gleich gemacht werden,
auch die Differenz nicht auf int runden für Rückgabewert int, sonst wird 0.4 (größer) vielleicht zu 0 (gleich groß)

Math.signum() kann man aber zu einem int machen
 

Neue Themen


Zurück
Oben