2010-06-02 6 views
5

Ich habe eine Methode, die eine Comparator für einen seiner Parameter benötigt. Ich würde gerne eine Comparator übergeben, die eine normalen Vergleich und eine umgekehrte Komparator, die umgekehrt macht.Direkte Komparator in Java out of the box

java.util.Collections bietet einedas ist gut für den umgekehrten Vergleich, aber ich konnte keine normale Comparator finden. Die einzige Lösung, die mir in den Sinn kam, ist Collections.reverseOrder(Collections.reverseOrder()). aber ich mag es nicht, weil die doppelte Methode nach innen ruft.

Natürlich könnte ich eine NormalComparator so schreiben:

public class NormalComparator<T extends Comparable> implements Comparator<T> { 
    public int compare(T o1, T o2) { 
     return o1.compareTo(o2); 
    } 
} 

Aber ich bin wirklich überrascht, dass Java nicht eine Lösung für diese aus dem Kasten hat.

Antwort

6

Die meisten Orte, wo man eine Comparator haben auch eine Version ohne Verwendung eines Comparator überhaupt in diesem Fall nutzt die natürliche Reihenfolge angeben können (das heißt, es erwartet, dass alle Objekte Comparable implementieren und verwendet compareTo).

Also die allgemeine Lösung zu diesem ist, kein Comparator überhaupt zu spezifizieren. Haben Sie einen spezifischen Fall, in dem nur der Comparator Ansatz unterstützt wird?

Wenn Sie unbedingt brauchen, die Google Collections (sowie Guava, die eine Ober der Google Kollektionen ist) bietet Ordering.natural() die a Ordering object zurückgibt, die die natürliche Ordnung darstellen, wie durch die Comparable Schnittstelle definiert. Ordering implementiert Comparator, so können Sie einfach das verwenden.

+0

Es ist meine Methode, so dass es keine natürliche Reihenfolge hat. (eigentlich hat es, weil ich es geschrieben habe, um zu arbeiten, aber ich wollte nicht, ich suche eine bessere Lösung) –

+0

Und ja, ich schrieb es, weil ich die Quelle von 'HashTree' sah. –

+0

@KARASZI: welche 'HashTree' redest du? Es gibt keine solche Klasse in Java SE. Meinst du' TreeMap'? –

0

Für Rückwärts-Reihenfolge Verwendung Collections.reverseOrder() ...

Gibt einen Komparator, der auf einer Sammlung von Objekten, die die Schnittstelle Comparable implementieren, um die Umkehrung der natürlichen Ordnung auferlegt.

+0

Sie haben die Frage nicht verstanden. Ich möchte auch ein direktes, nicht nur das Gegenteil. Der Doppelrücklauf könnte der normale sein –

+0

@ István: Für natürliche Reihenfolge implementieren Sie einfach NaturalComparator für vergleichbare Objekte. Ich kann keine in Standardbibliotheken finden. –

+0

es war in der OP, wie Sie sehen konnten –

0

Es ist in der Regel keine Notwendigkeit für eine natürliche Ordnung Comparator<T>, da in der Regel eine Überlast ist, die ein Comparable<T> nimmt. Sie können jederzeit das Beispiel von Collections.reverseOrder() und schreiben etwas wie folgt festgelegt wie folgt vor:

private static final Comparator<?> NATURAL_ORDER = 
    new Comparator<Comparable<Object>>() { 
    @Override public int compare(Comparable<Object> o1, Comparable<Object> o2) { 
     return o1.compareTo(o2); 
    } 
    }; 

@SuppressWarnings("unchecked") 
public static <T> Comparator<T> naturalOrder() { 
    return (Comparator<T>) NATURAL_ORDER; 
} 

Sie können dann so etwas wie schreiben:

List<String> names = Arrays.asList("Bob", "Alice", "Carol"); 
Collections.sort(names, naturalOrder()); 
System.out.println(names); 
// prints "[Alice, Bob, Carol]" 
+0

wie Sie im OP sehen konnten, das habe ich gemacht! –

1

Aber ich bin wirklich überrascht, dass Java nicht über eine Lösung für diese out of the Box.

Ich denke, es wäre in einigen Fällen nützlich ... wie bei Ihnen. Aber in meisten Anwendungsfälle würde eine Anwendung einfach die compareTo Methode des Objekts direkt verwenden.Die Indirektsteuerung über ein Objekt Comparator würde keinen Zweck erfüllen ... die meiste Zeit.

Meine Vermutung ist, dass die Entwickler dieser Java-APIs Ihren Anwendungsfall nicht für wichtig genug erachteten, um ihn direkt zu unterstützen. Außerdem ist Ihre Implementierung nur vier Zeilen Code.

Die Java-Klassenbibliotheken sind nicht perfekt. Lerne damit zu leben :-).

+0

Und sie akzeptieren eine 'null' in jeder Methode, in der ein' Comparator' benötigt wurde (und sie die 'compareTo' Methode anstelle eines neuen' NaturalComparator' eingefügt haben), also nicht wirklich eine ** DRY ** Lösung. ich denke ... –