2010-12-13 19 views
18

Tengo una clase, que la ordeno ya por un atributo. Ahora necesito hacer otra cosa, que necesito crear otra forma de ordenar mis datos. ¿Cómo puedo hacerlo? Así puedo elegir entre los dos métodos. El único comando que conozco es Collections.sort que recogerá el método compareTo de la clase que quiero comparar con sus datos.¿Cómo puedo hacer 2 métodos comparables en una sola clase?

¿Es posible?

+0

Si es posible usar palabras más explícitas en lugar de "cosa" y "camino", luego dar buenas respuestas será más fácil. Tal como están las cosas, debo admitir respetuosamente que me costó entender la pregunta exacta. –

Respuesta

49

Lo que necesita hacer es implementar un Comparator personalizado. Y luego usar:

Collections.sort(yourList, new CustomComparator<YourClass>()); 

En concreto, se podría escribir: (Esto creará una clase anónima que implementa Comparator.)

Collections.sort(yourList, new Comparator<YourClass>(){ 
    public int compare(YourClass one, YourClass two) { 
     // compare using whichever properties of ListType you need 
    } 
}); 

Se puede construir estos en su clase, si te gusta:

class YourClass { 

    static Comparator<YourClass> getAttribute1Comparator() { 
     return new Comparator<YourClass>() { 
      // compare using attribute 1 
     }; 
    } 

    static Comparator<YourClass> getAttribute2Comparator() { 
     return new Comparator<YourClass>() { 
      // compare using attribute 2 
     }; 
    } 
} 

podría ser utilizado de esta manera:

Collections.sort(yourList, YourClass.getAttribute2Comparator()); 
3

Solo puede tener un método compareTo() en su clase.

Si desea ordenar la misma clase en más de una dirección, cree implementaciones Comparator.

3

Si los dos métodos requieren exactamente la misma huella, puede sobrecargar de forma inapropiada una sola clase con múltiples usos, que se resolvería mediante la fijación de la jerarquía de clases, como en lugar de usar "forma", subclase con "oval", "rectángulo", etc.

Si la creación de subclases no tiene sentido, debe crear diferentes clases de comparación. En Java, a menudo usa un Comparador para las comparaciones. Crear varios (o crear un comparador configurable): IsbnComparator, AuthorComparator, etc.

Ah, y la opción configurable serían:

 
BookComparator implements Compartor { 
    enum FIELD { AUTHOR, ISBN, ... }; 
    setSortOrder(int rank, FIELD field){...} 
} 
Cuestiones relacionadas