Tengo una lista de objetos que necesito ordenar en un campo, digamos Score. Sin pensarlo mucho, escribí una nueva clase que implementa Comparator, que hace la tarea y funciona.
Ahora, mirando hacia atrás en esto, me pregunto si debería haber hecho que mi clase implemente Comparable en lugar de crear una nueva clase que implemente Comparator. La puntuación es el único campo en el que se ordenarán los objetos.
¿Qué he hecho aceptable como práctica?
¿Es el enfoque correcto "Primero haga que la clase implemente Comparable (para el orden natural) y si se requiere una comparación de campo alternativa, entonces cree una nueva clase que implemente Comparator"?
Si (2) anterior es verdadero, entonces ¿significa que uno debe implementar Comparator solo después de que la clase implemente Comparable? (Suponiendo que soy dueño de la clase original).
fuente
Úselo
Comparable
si desea definir un comportamiento de ordenamiento predeterminado (natural) del objeto en cuestión, una práctica común es usar un identificador técnico o natural (¿base de datos?) Del objeto para esto.Úselo
Comparator
si desea definir un comportamiento de pedido controlable externo , esto puede anular el comportamiento de pedido predeterminado.fuente
Comparable
significa que estoy definiendo el orden natural?" , esto me dio la respuesta que estaba buscando. Gracias :)Utilizar
Comparable
:Utilizar
Comparator
:Comparable
.Comparable
).fuente
Comparable -
java.lang.Comparable: int compareTo(Object o1)
Un objeto comparable es capaz de compararse con otro objeto. La clase en sí debe implementar la interfaz java.lang.Comparable para poder comparar sus instancias.
only one sort sequence
función de las propiedades de las instancias. EX:Person.id
Comparador -
java.util.Comparator: int compare(Object o1, Object o2)
Un objeto comparador es capaz de comparar dos objetos diferentes. La clase no está comparando sus instancias, sino las instancias de alguna otra clase. Esta clase de comparador debe implementar la interfaz java.util.Comparator.
many sort sequence
y nombrar cada uno, según las propiedades de las instancias. EX:Person.id, Person.name, Person.age
Ejemplo:
Para Java 8 Lambda: Comparator, consulte mi publicación.
fuente
Comparable debe usarse cuando se comparan instancias de la misma clase.
El comparador se puede utilizar para comparar instancias de diferentes clases.
Comparable se implementa por clase que necesita definir un orden natural para sus objetos. Como String implementa Comparable.
En caso de que uno desee un orden de clasificación diferente, puede implementar el comparador y definir su propia forma de comparar dos instancias.
fuente
Si la clasificación de objetos debe basarse en el orden natural, use Comparable, mientras que si su clasificación debe realizarse en atributos de diferentes objetos, use Comparator en Java.
Principales diferencias entre Comparable y Comparator:
fuente
Comparator hace todo lo que hace comparable, y más.
Encontré el mejor enfoque para usar comparadores como clases anónimas de la siguiente manera:
Puede crear varias versiones de dichos métodos dentro de la clase que planea ordenar. Entonces puedes tener:
sortAccountsByPriorityAndType
etc ...
Ahora, puede usar estos métodos de clasificación en cualquier lugar y obtener la reutilización del código. Esto me da todo lo que sería comparable, y más ... así que no veo ninguna razón para usar algo comparable en absoluto.
fuente
Yo diría:
fuente
Los siguientes puntos le ayudarán a decidir en qué situaciones se debe usar Comparable y en qué Comparator:
1) Disponibilidad del código
2) Criterios de clasificación únicos versus múltiples
3) Arays.sort () y Collection.sort ()
4) Como claves en SortedMap y SortedSet
5) Más cantidad de clases versus flexibilidad
6) Comparaciones entre clases
7) Orden natural
Para obtener un artículo más detallado, puede consultar Cuándo usar comparador y cuándo usar comparador
fuente
fuente
Si necesita una clasificación de orden natural - Usuario comparable SI necesita una clasificación de orden personalizada - Utilice Comparador
Ejemplo:
La clasificación por orden natural se basaría en la identificación porque sería única y la clasificación por orden personalizado sería el nombre y el departamento.
Referencias: ¿
Cuándo debería una clase ser Comparable y / o Comparadora? http://javarevisited.blogspot.com/2011/06/comparator-and-comparable-in-java.html
fuente
Aquí había habido una pregunta similar: ¿ Cuándo debería una clase ser Comparable y / o Comparador?
Yo diría lo siguiente: Implementar Comparable para algo así como un orden natural, por ejemplo, basado en un ID interno
Implemente un Comparador si tiene un algoritmo de comparación más complejo, por ejemplo, múltiples campos, etc.
fuente
Comparable
.Comparable:
Siempre que queramos almacenar solo elementos homogéneos y el orden de clasificación natural predeterminado requerido, podemos optar por la
comparable
interfaz de implementación de clases .Comparador:
Siempre que queramos almacenar elementos homogéneos y heterogéneos y queramos ordenarlos en un orden de clasificación personalizado predeterminado, podemos optar por la
comparator
interfaz.fuente
Mi necesidad se basó en la fecha.
Entonces, usé Comparable y funcionó fácilmente para mí.
Una restricción con Comparable es que no se pueden usar para colecciones que no sean List.
fuente
Si eres dueño de la clase, mejor elige Comparable . Generalmente se usa Comparator si no es dueño de la clase pero tiene que usarla como TreeSet o TreeMap porque Comparator se puede pasar como un parámetro en el constructor de TreeSet o TreeMap. Puede ver cómo usar Comparator y Comparable en http://preciselyconcise.com/java/collections/g_comparator.php
fuente
Me han pedido que clasifique un rango definido de números en un tiempo mejor que nlogn en una de las entrevistas. (No se usa el ordenamiento por conteo)
La implementación de la interfaz Comparable sobre un objeto permite que los algoritmos de clasificación implícitos utilicen el método compareTo reemplazado para ordenar los elementos de clasificación y eso sería un tiempo lineal.
fuente
Comparable es el orden de clasificación natural predeterminado proporcionado para valores numéricos ascendentes y para cadenas en orden alfabético. por ejemplo:
Comparator es el orden de clasificación personalizado implementado en la clase myComparator personalizada anulando un método de comparación para, por ejemplo:
fuente
Un enfoque muy simple es asumir que la clase de entidad en cuestión está representada en la base de datos y luego en la tabla de la base de datos, ¿necesitaría un índice compuesto por campos de la clase de entidad? Si la respuesta es sí, implemente comparable y use los campos de índice para el orden de clasificación natural. En todos los demás casos, utilice el comparador.
fuente
Mi biblioteca de anotaciones para implementar
Comparable
yComparator
:Haga clic en el enlace para ver más ejemplos. http://code.google.com/p/compamatic/wiki/CompamaticByExamples
fuente