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:
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.
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, 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.
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
Para implementar una interfaz
Comparable
, la clase debe implementar un solo métodocompareTo()
int a.compareTo(b)
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
Para implementar la interfaz Comparator, la clase debe implementar un solo método
compare()
int compare (a,b)
- 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.