Hallo zusammen,
habe eine Liste mit Objekten, die ich sortieren möchte. Grundsätzlich kein großes Problem, da Java ja gute Schnittstellen bietet. Aber bei mir gibt es einzelne Fälle, in denen das Ergebnis des Vergleichs zweier Objekte (compareTo) noch von weiteren Objekten abhängt.
Hier mal ein vereinfachtes Codebeispiel
Klasse mit meinen Objekten
Klasse mit Main-Methode
Standardmäßig sollen die Objekte nach den int-Werten sortiert werden. In den meisten Fällen sind diese auch unterschiedlich.
Unterscheiden sich die zwei Objekte aber nur in der booleschen Variable, so soll die Reihenfolge so sein, dass sich in der sortierten Liste true und false wenn möglich abwechseln. In diesem Fall hängt es also davon ab, welchen Werte die Objekte vor bzw. nach den "gleichen" haben.
In meinem Beispiel sind es die zwei Objekte (4, true) und (4, false), die jeweils unterschiedlich sortiert werden.
Spontan fallen mir zwei Möglichkeiten ein, wie man das implementieren könnte:
habe eine Liste mit Objekten, die ich sortieren möchte. Grundsätzlich kein großes Problem, da Java ja gute Schnittstellen bietet. Aber bei mir gibt es einzelne Fälle, in denen das Ergebnis des Vergleichs zweier Objekte (compareTo) noch von weiteren Objekten abhängt.
Hier mal ein vereinfachtes Codebeispiel
Klasse mit meinen Objekten
Java:
public class MyRecord implements Comparable<MyRecord> {
int iValue;
boolean bBoolean;
public MyRecord(int iVal, boolean bBool) {
iValue = iVal;
bBoolean = bBool;
}
@Override
public int compareTo(MyRecord other) {
int iReturn = 0;
if (iValue > other.iValue) {
iReturn = 1;
} else if (iValue < other.iValue) {
iReturn = -1;
} else if (bBoolean == other.bBoolean) {
iReturn = 0;
} else {
// iNumber==other.iNumber
// bBoolean!=other.bBoolean
// => hier hängt es von mehr als diesen beiden Objekten ab
// deshalb erst mal -1 zurückgeben
iReturn = -1;
}
return iReturn;
}
@Override
public String toString() {
return "Wert: " + iValue + ", boolean: " + bBoolean;
}
}
Klasse mit Main-Methode
Java:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class KSKB {
// Konstruktor
public static void main(String[] args) {
List<MyRecord> al = new ArrayList<MyRecord>();
System.out.println("Beispiel 1");
al.add(new MyRecord(5, true));
al.add(new MyRecord(4, false));
al.add(new MyRecord(4, true));
al.add(new MyRecord(3, false));
Collections.sort(al);
System.out.println("Nach dem Sortieren....");
for (MyRecord rec : al) {
System.out.println(rec.toString());
}
System.out.println();
System.out.println("Die gewünschte Ausgabe wäre aber");
al.clear();
al.add(new MyRecord(3, false));
al.add(new MyRecord(4, true));
al.add(new MyRecord(4, false));
al.add(new MyRecord(5, true));
for (MyRecord rec : al) {
System.out.println(rec.toString());
}
System.out.println();
System.out.println("Beispiel 2");
al.clear();
al.add(new MyRecord(5, false));
al.add(new MyRecord(4, true));
al.add(new MyRecord(4, false));
al.add(new MyRecord(3, true));
Collections.sort(al);
System.out.println("Nach dem Sortieren....");
for (MyRecord rec : al) {
System.out.println(rec.toString());
}
System.out.println();
System.out.println("Die gewünschte Ausgabe wäre aber");
al.clear();
al.add(new MyRecord(3, true));
al.add(new MyRecord(4, false));
al.add(new MyRecord(4, true));
al.add(new MyRecord(5, false));
for (MyRecord rec : al) {
System.out.println(rec.toString());
}
}
}
Standardmäßig sollen die Objekte nach den int-Werten sortiert werden. In den meisten Fällen sind diese auch unterschiedlich.
Unterscheiden sich die zwei Objekte aber nur in der booleschen Variable, so soll die Reihenfolge so sein, dass sich in der sortierten Liste true und false wenn möglich abwechseln. In diesem Fall hängt es also davon ab, welchen Werte die Objekte vor bzw. nach den "gleichen" haben.
In meinem Beispiel sind es die zwei Objekte (4, true) und (4, false), die jeweils unterschiedlich sortiert werden.
Spontan fallen mir zwei Möglichkeiten ein, wie man das implementieren könnte:
- erst Collection.sort() aufrufen, dann die dadurch vorsortierte Liste auf "gleiche" prüfen und ggf. von Hand zwei Einträge tauschen
- auf das Standardsortieren verzichten und eine eigene Sortiermethode implementieren. Dann müsste ich dafür sorgen, dass compareTo auf diese Objekte nicht aufgerufen wird.