2008-10-26 23 views
8

¿Tiene Cualquiera sabe de algún tipo de fábrica Comparador en Java, con unJava Comparador

public Comparator getComparatorForClass(Class clazz) {} 

Se comparadores volvería para cosas como cuerdas, doble, entero, pero tendría un

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

Para tipos arbitrarios.

+1

Usando Comparable es una buena opción. Tal fábrica no tiene sentido en general. –

+0

¿Qué le haría a las clases que tienen más de un Comparadores? Por ejemplo, ¿un empleado que puede clasificarse por nombre o por ID? –

Respuesta

13

En lugar de:

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

simplemente podría aplicar Comparable y escribir:

x.compareTo(y) 

cadena, los envoltorios de primitivas, y las colecciones estándar ya aplicar Comparable.

4

No tengo conocimiento de algo así fuera de mi cabeza. Si realmente necesita algo como esto, no debería ser demasiado difícil implementar uno usted mismo.

Sin embargo, ¿podría explicar por qué necesita algo como esto? Normalmente no debe haber un comparador "predeterminado" para las clases. Si la clase tiene algún tipo de ordenamiento natural, realmente debe implementarlo java.lang.Comparable, e implementar Comparable#compareTo(Object) : int en su lugar.

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

10

Uso de CompareToBuilder Commons Lang.

Ayuda en la implementación de métodos Comparable.compareTo (Object).

Para utilizar este código de escritura de clase de la siguiente manera:

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

Comparador son necesidad de ser extender .. esto se basa en la implementación del código reutilizable .. en estos métodos se puede tener una comparación personalizada de datos ... la implementación es simplemente simple ... solo implemente la interfaz Comparator ... anule su método compareto y coloque el código de comparación ... y devuelva cuál cree que es mayor en términos de valores ...

0

El comparador predeterminado no existe en Java. Sin embargo, si está codificando con, por ejemplo, un buscador personalizado, que tiene la intención de utilizar el comparador en lugar del método compareTo() del tipo derivado de la clase Comparable, puede escribir una clase de comparador interno estático como el comparador predeterminado, simplemente implementando el el método compare() llamando a compareTo().

Ejemplo:

Buscador clase> { comparador Comparador privado;

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); 
    } 
} 
Cuestiones relacionadas