util usar new interfaz comparing como java comparator comparable

java - usar - new comparator()



¿Cuándo debería una clase ser Comparable y/o Comparador? (11)

He visto clases que implementan Comparable y Comparador . ¿Qué significa esto? ¿Por qué debería usar uno sobre el otro?


Aquí hay algunas diferencias entre Comparador y Comparable que encontré en la web:

  1. Si ves que la diferencia lógica entre estos dos es Comparador en Java, compara dos objetos que se le proporcionan, mientras que la interfaz Comparable compara "esta" referencia con el objeto especificado.

  2. Comparable en Java se usa para implementar el ordenamiento natural del objeto. En Java API String, las clases Date y wrapper implementan la interfaz Comparable.

  3. Si cualquier clase implementa una interfaz Comparable en Java, entonces la recopilación de ese objeto, ya sea List o Array, se puede ordenar automáticamente mediante el método Collections.sort () o Array.sort () y el objeto se ordenará según el orden natural definido por el método CompareTo.

  4. 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 Comparador y Comparable en Java? Con el ejemplo

Leer más: ¿Cómo usar Comparador y Comparable en Java? Con el ejemplo


Comparable permite a una clase implementar su propia comparación:

  • está en la misma clase (a menudo es una ventaja)
  • solo puede haber una implementación (por lo que no puede usar eso si quiere dos casos diferentes)

En comparación, Comparator es una comparación externa:

  • por lo general, se encuentra en una instancia única (ya sea en la misma clase o en otro lugar)
  • usted nombra cada implementación con la forma en que desea ordenar las cosas
  • puede proporcionar comparadores para las clases que no controla
  • la implementación es utilizable incluso si el primer objeto es nulo

En ambas implementaciones, aún puede elegir lo que quiere que se compare . Con genéricos, puede declararlo y hacer que se compruebe en tiempo de compilación. Esto mejora la seguridad, pero también es un desafío determinar el valor apropiado.

Como guía, generalmente utilizo la clase o interfaz más general con la que se puede comparar ese objeto, en todos los casos de uso que imagino ... ¡aunque no es una definición muy precisa! :-(

  • Comparable<Object> 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 emitirlos según sea necesario, pero de una manera sólida.
  • Comparable<Itself> es muy estricto, por el contrario.

Es curioso, cuando se subclasifica a la Subclase, la Subclase también debe ser Comparable y robusta al respecto (o rompería el Principio de Liskov, y le daría errores de tiempo de ejecución).


El siguiente texto proviene de Comparator vs Comparable

Comparable

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.

Comparador

Un objeto de comparación es capaz de comparar dos objetos diferentes. La clase no compara sus instancias, sino algunas instancias de otras clases. Esta clase de comparador debe implementar la interfaz java.util.Comparator .


Implementar Comparable significa "Me puedo comparar con otro objeto". Esto es típicamente útil cuando hay una única comparación predeterminada natural.

La implementación de Comparator significa "puedo comparar otros dos objetos". Esto suele ser útil cuando hay varias formas de comparar dos instancias de un tipo: por ejemplo, puede comparar personas por edad, nombre, etc.


Mi anotación lib 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. compamatic


Si ves que la diferencia lógica entre estos dos es Comparator en Java, compara dos objetos que se le proporcionan, mientras que la interfaz Comparable 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 interfaz Comparable .

Si cualquier clase implementa una interfaz Comparable en Java, entonces la recopilación de ese objeto, ya sea List o Array puede ordenarse automáticamente mediante el método Collections.sort() o Array.sort() y el objeto se ordenará según el orden natural definido por compareTo 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 Comparator .


Comparable es generalmente preferido. Pero a veces una clase ya implementa Comparable , pero desea ordenar una propiedad diferente. Entonces estás obligado a usar un Comparator .

Algunas clases realmente proporcionan Comparators para casos comunes; por ejemplo, String s son por defecto sensibles a mayúsculas y minúsculas cuando se ordenan, pero también hay un Comparator estático llamado CASE_INSENSITIVE_ORDER .


Comparable es para objetos con un orden natural. El objeto en sí sabe cómo se ordena.
Comparator es para objetos sin un orden natural o cuando desea usar un orden diferente.


Comparable es para proporcionar un orden predeterminado en objetos de datos, por ejemplo, si los objetos de datos tienen un orden natural.

Un Comparator representa el orden en sí mismo para un uso específico.


Diferencia entre comparador e interfaces comparables

Comparable se usa para comparar a sí mismo al usar con otro objeto.

Comparator se usa para comparar dos tipos de datos que son objetos.


java.lang.Comparable

  1. Para implementar una interfaz Comparable , la clase debe implementar un solo método compareTo()

    int a.compareTo(b)

  2. Debe modificar la clase cuya instancia desea ordenar. De modo que solo se puede crear una secuencia de clasificación por clase.

java.util.Comparator

  1. Para implementar la interfaz Comparator, la clase debe implementar un solo método compare()

    int compare (a,b)

  2. Construyes una clase separada de la clase cuya instancia quieres ordenar. Para que se pueda crear una secuencia de clasificación múltiple por clase.