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.Comparable
interfaz 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.Comparator
interfaz.
Implementar Comparable
significa " puedo compararme con otro objeto " . Esto suele ser útil cuando hay una única comparación natural por defecto.
Implementar Comparator
significa " 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.
Person
implemento Comparable
, porque no puede cambiar cómo se comparan dos personas.
Person
. 2) El comparador, por ejemplo, PersonAgeComparator
que 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 Comparable
interfaz, 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)
Comparable
generalmente 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 Comparators
casos comunes; por ejemplo, los String
s distinguen entre mayúsculas y minúsculas cuando se ordenan, pero también hay una Comparator
llamada 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
Comparable
es para objetos con un orden natural. El objeto mismo sabe cómo se debe ordenar.
Comparator
es 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á Comparator
en Java, compare dos objetos proporcionados a él, mientras que la Comparable
interfaz compara "esta" referencia con el objeto especificado.
Comparable
en Java se usa para implementar el ordenamiento natural del objeto. En Java API String, las clases Date y wrapper implementan la Comparable
interfaz.
Si alguna clase implementa una Comparable
interfaz en Java, entonces la colección de ese objeto puede List
o Array
se 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 compareTo
método.
Los objetos que se implementan Comparable
en 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