java - descargar - ¿Cuál es la diferencia entre compare() y compareTo()?
java offline (14)
¿Cuál es la diferencia entre los métodos compare()
y compareTo()
Java? ¿Estos métodos dan la misma respuesta?
Cuando desee ordenar una Lista que incluya el objeto Foo, la clase Foo tiene que implementar la interfaz Comparable, porque el método de clasificación de la Lista utiliza este método.
Cuando desee escribir una clase Util que compare otras dos clases, puede implementar la clase Comparator.
De JavaNotes :
a.compareTo(b)
:
Interfaz comparable: compara valores y devuelve un int que indica si los valores se comparan menos de, igual o mayor que.
Si los objetos de su clase tienen un orden natural , implemente la interfazComparable<T>
y defina este método. Todas las clases de Java que tienen un orden natural implementanComparable<T>
- Ejemplo:String
, clases de contenedor ,BigInteger
compare(a, b)
:
Interfaz de comparación : compara valores de dos objetos. Esto se implementa como parte de la interfazComparator<T>
, y el uso típico es definir una o más clases de utilidad pequeñas que implementan esto, para pasar a métodos comosort()
o para usar clasificando estructuras de datos comoTreeMap
yTreeSet
. Es posible que desee crear un objeto Comparator para lo siguiente:- Comparaciones múltiples Para proporcionar varias formas diferentes de ordenar algo. Por ejemplo, es posible que desee ordenar una clase Person por nombre, ID, edad, altura, ... Definiría un Comparador para cada uno de estos para pasar al método
sort()
. - Clase del sistema Proporcionar métodos de comparación para las clases sobre las que no tiene control. Por ejemplo, podría definir un Comparador para cadenas que las comparó por longitud.
- Patrón de estrategia Implementar un patrón de estrategia, que es una situación en la que desea representar un algoritmo como un objeto que puede pasar como parámetro, guardar en una estructura de datos, etc.
- Comparaciones múltiples Para proporcionar varias formas diferentes de ordenar algo. Por ejemplo, es posible que desee ordenar una clase Person por nombre, ID, edad, altura, ... Definiría un Comparador para cada uno de estos para pasar al método
Si los objetos de su clase tienen un orden de clasificación natural, es posible que no necesite compare ().
Resumen de http://www.digizol.com/2008/07/java-sorting-comparator-vs-comparable.html
Comparable
Un objeto comparable es capaz de compararse con otro objeto.
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.
Usar contextos de casos:
Interfaz comparable
El método igual y los operadores ==
y !=
Evalúan la igualdad / desigualdad, pero no proporcionan una forma de evaluar valores relativos .
Algunas clases (por ejemplo, String y otras clases con un orden natural) implementan la interfaz Comparable<T>
, que define un compareTo()
.
Deberá implementar Comparable<T>
en su clase si desea usarlo con los métodos Collections.sort()
o Arrays.sort()
.
Definición de un objeto comparador
Puede crear comparadores para ordenar cualquier forma arbitraria para cualquier clase .
Por ejemplo, la clase String
define el comparador CASE_INSENSITIVE_ORDER
.
La diferencia entre los dos enfoques se puede vincular a la noción de:
Colección ordenada :
Cuando se ordena una Colección, significa que puede iterar en la colección en un orden específico (no aleatorio) (no se ordena una Hashtable
).
Una colección con un orden natural no solo se ordena, sino que se ordena . ¡Definir un orden natural puede ser difícil! (como en el orden de Cadena natural ).
Otra diferencia, señalada por HaveAGuess en los comentarios :
-
Comparable
está en la implementación y no es visible desde la interfaz, por lo que cuando ordena no sabe realmente qué va a pasar. -
Comparator
le garantiza que el pedido estará bien definido.
La principal diferencia está en el uso de las interfaces:
Comparable (que tiene compareTo ()) requiere que los objetos sean comparados (para usar un TreeMap u ordenar una lista) para implementar esa interfaz. Pero, ¿y si la clase no implementa Comparable y no puede cambiarlo porque es parte de una biblioteca de terceros? Luego debe implementar un Comparador, que es un poco menos conveniente de usar.
La relación del objeto que tiene este método y sus colaboradores es diferente.
compareTo()
es un método de la interfaz Comparable , por lo que se usa para comparar ESTA instancia con otra.
compare()
es un método de la interfaz Comparator , por lo que se usa para comparar dos instancias diferentes de otra clase entre sí.
Si lo hace, implementar Comparable
significa que las instancias de la clase se pueden comparar fácilmente.
La implementación de Comparator
significa que las instancias son adecuadas para comparar diferentes objetos (de otras clases).
Los métodos no tienen que dar las mismas respuestas. Eso depende de qué objetos / clases los llames.
Si está implementando sus propias clases que sabe que desea comparar en algún momento, puede hacer que implementen la interfaz Comparable e implementen el método compareTo () en consecuencia.
Si está utilizando algunas clases de una API que no implementan la interfaz Comparable, pero aún desea compararlas. Es decir, para clasificar. Puede crear su propia clase que implemente la interfaz Comparator y en su método compare () implemente la lógica.
Tabla de empleados
Nombre, DoB, Salario
Tomás, 2/10/1982, 300
Daniel, 11/03/1990, 400
Kwame, 2/10/1998, 520
La interfaz Comparable le permite ordenar una lista de objetos, por ejemplo, Empleados con referencia a un campo primario; por ejemplo, puede ordenar por nombre o por salario con el método CompareTo ()
emp1.getName().compareTo(emp2.getName())
La interfaz del Comparador proporciona una interfaz más flexible para tales requisitos, cuyo único método es comparar ()
public interface Comparator<Employee> {
int compare(Employee obj1, Employee obj2);
}
Código de muestra
public class NameComparator implements Comparator<Employee> {
public int compare(Employee e1, Employee e2) {
// some conditions here
return e1.getName().compareTo(e2.getName()); // returns 1 since (T)omas > (D)an
return e1.getSalary().compareTo(e2.getSalary()); // returns -1 since 400 > 300
}
}
Un punto más:
-
compareTo()
es de la interfazComparable
ycompare()
es de la interfaz delComparator
. -
Comparable
se utiliza para definir un orden predeterminado para los objetos dentro de una clase, mientras queComparator
se usa para definir un pedido personalizado que se pasará a un método.
Usando el comparador, podemos tener n cantidad de lógica de comparación escrita para una clase .
P.ej
Para una clase de auto
Podemos tener una clase de comparación para comparar en función del número de modelo del automóvil. También podemos tener una clase de comparación para comparar según el año del modelo del automóvil.
Clase de coche
public class Car {
int modelNo;
int modelYear;
public int getModelNo() {
return modelNo;
}
public void setModelNo(int modelNo) {
this.modelNo = modelNo;
}
public int getModelYear() {
return modelYear;
}
public void setModelYear(int modelYear) {
this.modelYear = modelYear;
}
}
Comparador n. ° 1 basado en el modelo n.
public class CarModelNoCompartor implements Comparator<Car>{
public int compare(Car o1, Car o2) {
return o1.getModelNo() - o2.getModelNo();
}
}
Comparador # 2 basado en el año modelo
public class CarModelYearComparator implements Comparator<Car> {
public int compare(Car o1, Car o2) {
return o1.getModelYear() - o2.getModelYear();
}
}
Pero esto no es posible con el caso de la interfaz Comparable .
En el caso de la interfaz Comparable, podemos tener solo una lógica en el método compareTo () .
compareTo()
se llama en un objeto, para compararlo con otro objeto. compare()
se llama en algún objeto para comparar otros dos objetos.
La diferencia es donde se define la lógica que hace la comparación real.
compareTo()
es de la interfaz Comparable
.
compare()
es de la interfaz del Comparator
.
Ambos métodos hacen lo mismo, pero cada interfaz se usa en un contexto ligeramente diferente.
La interfaz Comparable se usa para imponer un orden natural en los objetos de la clase implementadora. El compareTo()
se llama método de comparación natural. La interfaz del Comparator se usa para imponer un orden total en los objetos de la clase implementadora. Para obtener más información, consulte los enlaces para saber exactamente cuándo usar cada interfaz.
La interfaz comparable contiene un método llamado compareTo(obj)
que toma solo un argumento y se compara con otra instancia u objetos de la misma clase.
La interfaz del comparador contiene un método llamado compare(obj1,obj2)
que toma dos argumentos y compara el valor de dos objetos de la misma clase o de diferentes clases.
Semejanzas
Ambas son formas personalizadas de comparar dos objetos.
Ambos devuelven un int
describe la relación entre dos objetos.
Diferencias: el método compare()
es un método que está obligado a implementar si implementa la interfaz Comparator
. Le permite pasar dos objetos al método y devuelve un int
describe su relación.
Comparator comp = new MyComparator();
int result = comp.compare(object1, object2);
El método compareTo()
es un método que está obligado a implementar si implementa la interfaz Comparable
. Permite que un objeto se compare con objetos de tipo similar.
String s = "hi";
int result = s.compareTo("bye");
Resumen:
Básicamente son dos formas diferentes de comparar cosas.
Important Answar
String name;
int roll;
public int compare(Object obj1,Object obj2) { // For Comparator interface
return obj1.compareTo(obj1);
}
public int compareTo(Object obj1) { // For Comparable Interface
return obj1.compareTo(obj);
}
Aquí, a return obj1.compareTo(obj1)
u return obj1.compareTo(obj)
instrucción solo toma Object; primitivo no está permitido. Por ejemplo
name.compareTo(obj1.getName()) // Correct Statement.
Pero
roll.compareTo(obj1.getRoll())
// Wrong Statement Compile Time Error Because roll
// is not an Object Type, it is primitive type.
name es String Object así que funcionó. Si desea ordenar el número de rollo de estudiante, utilice el código siguiente.
public int compareTo(Object obj1) { // For Comparable Interface
Student s = (Student) obj1;
return rollno - s.getRollno();
}
o
public int compare(Object obj1,Object obj2) { // For Comparator interface
Student s1 = (Student) obj1;
Student s2 = (Student) obj2;
return s1.getRollno() - s2.getRollno();
}
compareTo(T object)
proviene de la interfaz java.lang.Comparable, implementada para comparar este objeto con otro para dar un valor int negativo para este objeto que es menor que, 0 para iguales, o valor positivo para mayor que el otro. Este es el método de comparación más conveniente, pero debe implementarse en todas las clases que desee comparar.
compare(T obj1, T obj2)
proviene de la interfaz java.util.Comparator, implementada en una clase separada que compara los objetos de otra clase para dar un valor int negativo para el primer objeto que es menor que, 0 para iguales, o valor positivo para mayor que el segundo objeto. Es necesario cuando no se puede hacer que una clase implemente compareTo () porque no es modificable. También se usa cuando desea diferentes formas de comparar objetos, no solo uno (como por nombre o edad).