2008-10-26 6 views
8

Est-ce que quelqu'un sait d'une sorte d'usine de Comparator en Java, avec unJava Comparator

public Comparator getComparatorForClass(Class clazz) {} 

Il retournerait Comparateurs pour des choses comme String, Double, Entier mais aurait un

public void addComparatorForClass(Class clazz, Comparator comparator) {} 

Pour les types arbitraires.

+1

L'utilisation de Comparable est une bonne option. Une telle usine n'a aucun sens en général. –

+0

Que feraient-ils pour les classes qui ont plus d'un comparateur? Par exemple, un employé qui peut être trié par nom ou par ID? –

Répondre

13

Au lieu de:

factory.getComparatorForClass(x.getClass()).compare(x, y) 

vous pouvez simplement mettre en œuvre Comparable et écrire:

x.compareTo(y) 

String, les emballages primitifs et collections standards mettent déjà en œuvre Comparable.

4

Je ne suis pas au courant de quelque chose comme ça sur le dessus de ma tête. Si vous avez vraiment besoin de quelque chose comme ça, il ne devrait pas être trop difficile d'en implémenter un vous-même.

Cependant, pourriez-vous expliquer pourquoi vous avez besoin de quelque chose comme ça? Il ne devrait généralement pas y avoir de comparateur "par défaut" pour les classes. Si la classe a une sorte d'ordre naturel, vous devriez vraiment l'implémenter java.lang.Comparable, et implémenter Comparable#compareTo(Object) : int à la place.

http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Comparable.html

10

Utilisez CompareToBuilder des Communes Lang.

Aide à l'implémentation des méthodes Comparable.compareTo (Object).

Pour utiliser ce code d'écriture de classe comme suit:

public class MyClass { 
    String field1; 
    int field2; 
    boolean field3; 

    ... 

    public int compareTo(Object o) { 
    MyClass myClass = (MyClass) o; 
    return new CompareToBuilder() 
     .appendSuper(super.compareTo(o) 
     .append(this.field1, myClass.field1) 
     .append(this.field2, myClass.field2) 
     .append(this.field3, myClass.field3) 
     .toComparison(); 
    } 
} 
1

Comparator sont besoin d'être étendre .. cela est basé sur la mise en œuvre du code réutilisable .. dans ces méthodes, vous pouvez avoir une comparaison personnalisée de données .. la mise en œuvre est juste simple .. il suffit d'implémenter l'interface comparateur .. remplacer sa méthode compareto et placer le code de comparaison .. et le retour que vous pensez est plus grand en termes de valeurs ..

0

Le comparateur par défaut n'existe pas en Java. Cependant, si vous codez, par exemple, avec un chercheur personnalisé, qui a l'intention d'utiliser comparateur plutôt que la méthode compareTo() du type dérivé de classe Comparable, vous pouvez écrire une classe comparateur interne statique comme comparateur par défaut, en implémentant simplement méthode compare() en appelant le compareTo().

Exemple:

classe Searcher> { comparateur privé Comparator;

Searcher(Comparator<T> comparator) { 
    this.comparator = comparator; 
} 

Searcher() { 
    this(new DefaultComparator<T>()); 
} 

int search(...) { 
    ... 
} 

private static class DefaultComparator<E extends Comparable<E>> 
     implements Comparator<E> { 
    public int compare(E o1, E o2) { 
     return o1.compareTo(o2); 
    } 
}