Es ist mir bisher zwar erst zwei Mal untergekommen, aber das ist mir diesen Eintrag Wert.
Listen in Java zu sortieren ist dank vieler Vergleichsmethoden relativ problemlos möglich. Aber es soll auch vorkommen (wie bei mir jetzt das zweite Mal), dass man in der Liste nach mehr als einem Kriterium sortieren möchte. Hier kommt der MultiComparator zum Einsatz.
Den unrsprünglichen MultiComparator habe ich bei AllExperts.com gefunden. Diesen habe ich mal auf die neue Generics-Welt in Java umgeschrieben.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | package what.ever.you.like; import java.util.ArrayList; import java.util.Comparator; import java.util.List; /** * Comparator, der für das gegebene Objekt <code>T</code> mehrere Comperatoren * für eine Mehrfachsortierung anwenden kann. * @param <T> */ public class MultiComparator<T> implements Comparator { List<Comparator<T>> comparators = new ArrayList<Comparator<T>>(); public void addComparator(Comparator comp) { comparators.add(comp); } public void removeComparator(Comparator comp) { comparators.remove(comp); } public int compare(T obj1, T obj2) { int result = 0; for (Comparator comp : comparators) { result = comp.compare(obj1, obj2); if (result != 0) break; } return result; } } |
Diesem MultiComparator kann man jetzt weitere Comparatoren für ein beliebiges Objekt T hinzufügen. Diese sorgen dann für die eigentliche Sortierung. Hier ein kurzes Beispiel:
1 2 3 4 5 | MultiComparator<SomeObject> multiComp = new MultiComparator<SomeObject>(); multiComp.add(new FirstOtherComparatorForSomeObject()); multiComp.add(new SecondOtherComparatorForSomeObject()); Collections.sort(listWithSomeObjects, multiComp); |
Jetzt kann man für jeglichen complexeren Vergleich einen eigenen Comparator schreiben und diesen dann an den MultiComparator in der Reihenfolge anhängen, in welcher sortiert werden soll.
