Pregunta

He visto las clases que implementan tanto Comparable y Comparador.¿Qué significa esto?¿Por qué utilizar uno sobre el otro?

¿Fue útil?

Solución

El texto a continuación proviene de Comparador vs Comparable

Comparable

Un objeto comparable es capaz de compararse con otro objeto. La clase misma 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 está comparando sus instancias, sino algunas instancias de otra clase & # 8217; s. Esta clase de comparación debe implementar la interfaz java.util.Comparator.

Otros consejos

Implementar Comparable significa " Puedo compararme con otro objeto. " Esto suele ser útil cuando hay una única comparación natural predeterminada.

Implementar Comparator significa " Puedo comparar otros dos objetos. " Esto suele ser útil cuando hay múltiples formas de comparar dos instancias de un tipo, p. Ej. puedes comparar personas por edad, nombre, etc.

Comparable permite que una clase implemente su propia comparación:

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

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

  • normalmente está 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 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 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 emitirlos según sea necesario, pero de manera robusta.
  • Comparable<Itself> es muy estricto por el contrario.
  

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

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

    int a.compareTo(b)

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

java.util.Comparator

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

    int compare (a,b)

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

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

A Comparator representa el pedido en sí para un uso específico.

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

Algunas clases en realidad proporcionan String para casos comunes; por ejemplo, CASE_INSENSITIVE_ORDER s son por por defecto distingue entre mayúsculas y minúsculas cuando se ordena, pero también hay una <=> estática llamada <=> .

aquí hay algunas diferencias entre Comparator y Comparable que encontré en la web:

  1. 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 & "; esto &"; referencia con el objeto especificado.

  2. 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.

  3. 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 mediante el método Collections.sort () o Array.sort () y el objeto se ordenará según su naturalidad orden 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 Comparator y Comparable en Java? Con ejemplo

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

Comparable es para objetos con un orden natural. El objeto en sí 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 usarlo con otro objeto.

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

Si usted ve a continuación lógica de la diferencia entre estos dos es Comparator en Java comparar dos objetos proporcionados a él, mientras que Comparable interfaz compara a "esto" de referencia con el objeto especificado.

Comparable en Java se utiliza para implementar natural de pedidos de objeto.En la API de Java Cadena, Fecha y clases de contenedor de implementar Comparable la interfaz.

Si cualquier clase de implementar Comparable interfaz en Java, a continuación, la colección de ese objeto, ya sea List o Array se pueden ordenar de forma automática mediante el uso de Collections.sort() o Array.sort() método y objeto serán ordenadas de acuerdo en que hay un orden natural definido por compareTo método.

Los objetos que implementan Comparable en Java se puede utilizar como claves en función de un criterio mapa o elementos en un conjunto ordenado, por ejemplo TreeSet, sin especificar Comparator.

Mi lib de anotaciones 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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top