Sortierungsproblem

Status
Nicht offen für weitere Antworten.

Evolver

Bekanntes Mitglied
Ich habe eine Liste (java.util.List), die ich mit Elementen fülle und dann mit Hilfe eines eigenen Comparators durch Collections.sort(list, Comparator) sortieren lasse. Danach betrachte ich zwei spezifische Elemente und muss feststellen, das mal das eine, mal das andere weiter vorn in der Liste ist. Wie kann das sein? Ich bin mir nun nach längerem Debugging sicher, dass der Comperator richtig funktioniert und immer die gleichen Ergebnisse für den Vergleich der zwei Objekte liefert.

Irgendwelche Ideen? Ein kurzes ausführbares Beipiel aus meinem Code rauszulösen dürfte leider schwierig werden (ist jetzt recht umfangreich).
 

Landei

Top Contributor
Poste mal nur den Comparator, das Problem liegt dort. "Immer die gleichen Ergebnisse" reicht nicht.
 
Zuletzt bearbeitet:

Evolver

Bekanntes Mitglied
Java:
public class SingleFieldRenderingOrderComparator implements Comparator<SingleField>
{
	public int compare( SingleField field1, SingleField field2 )
	{		
		if( ( field1.getLogicX()>=field2.getLogicX() && field1.getLogicX()<=field2.getMaxLogicX() ) ||
			( field2.getLogicX()>=field1.getLogicX() && field2.getLogicX()<=field1.getMaxLogicX() ) )
		{
			if( field1.getMaxLogicY()>field2.getMaxLogicY() )
				return 1;
			else if( field1.getMaxLogicY()<field2.getMaxLogicY() )
				return -1;
			else
				return 0;
		}
		else
		{
			if( field1.getLogicX()<field2.getLogicX() )
				return -1;
			else if( field1.getLogicX()>field2.getLogicX() )
				return 1;
			else
				return 0;
		}
	}
}

Mit "Immer die gleichen Ergebnisse" meine ich schon:
vergleich(a, b) = -1
vergleich(b, a) = 1
 

Landei

Top Contributor
Hmmm, sieht tatsächlich OK aus.

Hat SingleField eventuell equals() überschrieben? Falls dem so ist und falls es in einigen Fällen true sagt, wo dein Comparator nicht 0 liefert, könnte das sort durcheinanderbringen.
 

Evolver

Bekanntes Mitglied
Nein, equals wird nicht überschrieben. Noch ein paar weitere Infos:
- die Werte (logicX, maxLogicX usw.) der beiden Objekte ändern sich nicht
- die beiden Objekte gehören zu einer von SingleField abgeleiteten Klasse (aber beide zur gleichen)
 

ARadauer

Top Contributor
kannst du das mal textuell schreiben..

Code:
if( ( field1.getLogicX()>=field2.getLogicX() && field1.getLogicX()<=field2.getMaxLogicX() ) ||
            ( field2.getLogicX()>=field1.getLogicX() && field2.getLogicX()<=field1.getMaxLogicX() ) )
wenn x von feld1 größer gleich als x von feld zwei und x von feld 1 kleiner gleich x von feld zwei... warum nicht gleich ==?
 

Evolver

Bekanntes Mitglied
Du hast das das "Max" überlesen. Ein Feld hat immer ein logicX und ein maxLogicX. Das äußere if prüft, ob sich die "Intervalle" (logicX bis maxLogicX) der beiden Felder überlappen.
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben