He visto clases que implementan Comparable y Comparator . ¿Qué significa esto? ¿Por qué usaría uno sobre el otro?
He visto clases que implementan Comparable y Comparator . ¿Qué significa esto? ¿Por qué usaría uno sobre el otro?
Respuestas:
El siguiente texto proviene de Comparador vs Comparable
Comparable
Un objeto comparable es capaz de compararse con otro objeto. La clase misma debe implementar la java.lang.Comparableinterfaz para poder comparar sus instancias.
Comparador
Un objeto de comparación es capaz de comparar dos objetos diferentes. La clase no compara sus instancias, sino las instancias de otras clases. Esta clase de comparación debe implementar la java.util.Comparatorinterfaz.
Implementar Comparablesignifica " puedo compararme con otro objeto " . Esto suele ser útil cuando hay una única comparación natural por defecto.
Implementar Comparatorsignifica " puedo comparar otros dos objetos " . Esto suele ser útil cuando hay múltiples formas de comparar dos instancias de un tipo, por ejemplo, podría comparar personas por edad, nombre, etc.
Personimplemento Comparable, porque no puede cambiar cómo se comparan dos personas.
Person. 2) El comparador, por ejemplo, PersonAgeComparatorque es capaz de comparar dos entidades diferentes y decidir cuál debe venir primero en ese orden de clasificación particular. 3) El código de clasificación, que toma una colección de entidades y un comparador, y clasifica esa colección usando el comparador para determinar el orden.
Comparable permite que una clase implemente su propia comparación:
En comparación, Comparator es una comparación externa:
En ambas implementaciones, aún puede elegir lo que desea comparar . Con los genéricos, puede declararlo y verificarlo en tiempo de compilación. Esto mejora la seguridad, pero también es un desafío determinar el valor apropiado.
Como guía, generalmente uso la clase o interfaz más general con la que se puede comparar ese objeto, en todos los casos de uso que imagino ... ¡Sin embargo, no es una definición muy precisa! :-(
Comparable<Object>le permite usarlo en todos los códigos en tiempo de compilación (que es bueno si es necesario, o malo si no y pierde el error en tiempo de compilación); su implementación tiene que hacer frente a los objetos y lanzarlos según sea necesario, pero de manera robusta.Comparable<Itself> Es muy estricto al contrario.Es curioso, cuando subclases a Subclase, la Subclase también debe ser Comparable y robusta (o rompería el Principio de Liskov y te daría errores de tiempo de ejecución).
java.lang.Comparable
Para implementar la Comparableinterfaz, la clase debe implementar un método únicocompareTo()
int a.compareTo(b)
Debe modificar la clase cuya instancia desea ordenar. Para que solo se pueda crear una secuencia de clasificación por clase.
java.util.Comparator
Para implementar la interfaz Comparator, la clase debe implementar un método único compare()
int compare (a,b)
Comparablegeneralmente se prefiere. Pero a veces una clase ya se implementa Comparable, pero desea ordenar en una propiedad diferente. Entonces te ves obligado a usar a Comparator.
Algunas clases en realidad prevén Comparatorscasos comunes; por ejemplo, los Strings distinguen entre mayúsculas y minúsculas cuando se ordenan, pero también hay una Comparatorllamada estática CASE_INSENSITIVE_ORDER.
Aquí hay algunas diferencias entre Comparator y Comparable que encontré en la web:
Si ve que la diferencia lógica entre estos dos es Comparador en Java, compare dos objetos proporcionados a él, mientras que la interfaz Comparable compara "esta" referencia con el objeto especificado.
Comparable en Java se utiliza para implementar el orden natural del objeto. En Java API String, las clases Date y wrapper implementan una interfaz comparable.
Si alguna clase implementa una interfaz comparable en Java, la colección de ese objeto, ya sea List o Array, se puede ordenar automáticamente utilizando el método Collections.sort () o Array.sort () y el objeto se ordenará según el orden natural definido por el método CompareTo.
Los objetos que implementan Comparable en Java se pueden usar como claves en un mapa ordenado o elementos en un conjunto ordenado, por ejemplo TreeSet, sin especificar ningún Comparador.
sitio: ¿Cómo usar Comparator y Comparable en Java? Con el ejemplo
Leer más: ¿Cómo usar Comparator y Comparable en Java? Con el ejemplo
Comparablees para objetos con un orden natural. El objeto mismo sabe cómo se debe ordenar.
Comparatores para objetos sin un orden natural o cuando desea utilizar un orden diferente.
Diferencia entre comparador e interfaces comparables
Comparable se usa para compararse al usar con otro objeto.
Comparator Se utiliza para comparar dos tipos de datos que son objetos.
Si ve que la diferencia lógica entre estos dos está Comparatoren Java, compare dos objetos proporcionados a él, mientras que la Comparableinterfaz compara "esta" referencia con el objeto especificado.
Comparableen Java se usa para implementar el ordenamiento natural del objeto. En Java API String, las clases Date y wrapper implementan la Comparableinterfaz.
Si alguna clase implementa una Comparableinterfaz en Java, entonces la colección de ese objeto puede Listo Arrayse puede ordenar automáticamente usando Collections.sort()o Array.sort()método y el objeto se ordenará según el orden natural definido por el compareTométodo.
Los objetos que se implementan Comparableen Java pueden usarse como claves en un mapa ordenado o elementos en un conjunto ordenado, por ejemplo TreeSet, sin especificar ninguno Comparator.
Mi lib de anotación para implementar Comparable y Comparator:
public class Person implements Comparable<Person> {
private String firstName;
private String lastName;
private int age;
private char gentle;
@Override
@CompaProperties({ @CompaProperty(property = "lastName"),
@CompaProperty(property = "age", order = Order.DSC) })
public int compareTo(Person person) {
return Compamatic.doComparasion(this, person);
}
}
Haga clic en el enlace para ver más ejemplos. comparativo