Comparator bei Gleichheit zweites Kriterium mitgeben

Status
Nicht offen für weitere Antworten.

Jay1980

Bekanntes Mitglied
Servus,

ich habe einen Comparator als innere Klasse. Wie kann ich nun ein zweites Kriterium einbauen, dass herangezogen werden soll, wenn der erste Vergleich "Elemente sind gleich" liefert? Das zweite Attribut ist winkel und vom Typ double.

Java:
umkreisBaum = new TreeSet<Umkreis>( new Comparator<Umkreis>(){
			@Override
			public int compare( Umkreis u1, Umkreis u2 )
			{
				Double x1 = new Double(u1.umkreisradiusZumQuadrat);
				Double x2 = new Double(u2.umkreisradiusZumQuadrat);
				return x1.compareTo(x2);
			}
		});
 

Marco13

Top Contributor
Eigentlich würde man einfach sagen
Code:
int resultUntilNow = x1.compareTo(x2);
if (resultUntilNow == 0)
{
    return dasAndereKriterium();
}

In diesem speziellen Fall werden aber Doubles verglichen - und dort tritt der Fall, dass die Werte WIRKLICH gleich sind aufrgrund von Rundungsfehlern manchmal nicht ein, obwohl der Unterschied zwischen den Werte eigentlich 0 sein müßte. Du solltest zumindest sowas machen wie
Code:
public int compare( Umkreis u1, Umkreis u2 )
{
    double epsilon = 1e-8;
    double diff = u1.umkreisradiusZumQuadrat - u2.umkreisradiusZumQuadrat;
    if (diff < epsilon)
    {
        return -1;
    }
    if (diff > epsilon)
    {
        return 1;
    }
    return dasAndereKriterium();
}
EDIT: ... häm - die 1/-1 vielleicht vertauscht, musst' mal schauen.
 

Jay1980

Bekanntes Mitglied
Ich denke ich werde immer nur ganze Zahlen in den Vergleich schicken, dann ist es doch egal, ob da double steht.

also double 145 == double 145 ist doch ohnehin gleich oder?
 

Marco13

Top Contributor
Der Fall dass ein "umkreisradiusZumQuadrat" immer eine ganze Zahl ergibt schränkt die Möglichkeiten, um welche Umkreise es sich da handeln kann, schon erheblich ein, aber das ändert nur bedingt was - je nachdem, wie diese Werte ausgerechnet werden (im speziellen wenn es nicht immer genau Quadratzahlen sind ;) ) können sie sich um einen Betrag unterscheiden, den man z.B. bei einem
System.out.println(wert);
gar nicht sieht.

float- und double-Werte sollten fast immer mit einem epsilon verglichen werden - wenige Ausnahmen können spezielle Werte wie 0 oder 1 sein, die sich genau darstellen lassen, und die man irgendwo explizit setzt. Das was hier steht [29] Newbie Questions / Answers  Updated! , C++ FAQ Lite gilt auch für Java.
 

Jay1980

Bekanntes Mitglied
Danke für den Hinweis, jetzt weiss ich auch warum es einen grossen Unterscheid macht, ob man long oder double nutzt, obwohl beide acht Byte und nen relativ großen Wertebereich haben - verdammt, da muss ich nochmal gut drüber über meine Anwendung.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Comparator Allgemeine Java-Themen 3
T komplizierter Comparator (IllegalArgumentException) Allgemeine Java-Themen 3
D Comparator Allgemeine Java-Themen 7
S TreeSet - Comparator ändern -> resort? Allgemeine Java-Themen 8
W Comparator oder TreeMap? Allgemeine Java-Themen 10
R Eigener Comparator Allgemeine Java-Themen 2
J TreeSet und Comparator will nicht so wie ich Allgemeine Java-Themen 2
R Eigenen Comparator schreiben ? Allgemeine Java-Themen 10
V Comparator (steh wohl aufm Schlauch) Allgemeine Java-Themen 12
B Sortierung einer ArrayList mit Comparator Allgemeine Java-Themen 6
Z Probleme mit Comparator für binarySearch Allgemeine Java-Themen 2
S Performance von Comparator Allgemeine Java-Themen 3
T TreeMap durch Comparator mit Generics sortieren Allgemeine Java-Themen 9
N Object-Array mit Comparator absteigend sortieren? Allgemeine Java-Themen 10
S Comparator verwenden? Allgemeine Java-Themen 2
J Arrays auf gleichheit untersuchen funktioniert nicht Allgemeine Java-Themen 11
A Bilder vergleichen auf gleichheit oder ähnlichkeit Allgemeine Java-Themen 8
B Dateien prüfen auf Gleichheit Allgemeine Java-Themen 5
turmaline Gleichheit von zwei Maps Map <String, Map <String, String>> Allgemeine Java-Themen 30
B tiefe gleichheit / flache gleichheit Allgemeine Java-Themen 5
N 2 files auf gleichheit vergleichen Allgemeine Java-Themen 5
J Chars auf Gleichheit mit Klamern/Operatoren überprüfen Allgemeine Java-Themen 3
Linad Bilder auf Gleichheit prüfen Allgemeine Java-Themen 6
E Zweites Java Programm sichtbar starten Allgemeine Java-Themen 4
G Zweites Java-Programm im ersten aufrufen?!? Allgemeine Java-Themen 15

Ähnliche Java Themen

Neue Themen


Oben