Comparable Vs Comparator
Comparable Vs Comparator
en Java
Comparable y Comparator son las interfaces genéricas en Java que se utilizan para
comparar los elementos de datos de los objetos. La interfaz Comparable está
presente en el paquete java.lang y la interfaz Comparator está presente en el
paquete java.util.
La diferencia básica entre las interfaces Comparable y Comparator es que la interfaz
Comparable proporciona la única secuencia de clasificación, mientras que la interfaz
Comparator proporciona las múltiples secuencias de clasificación. Existen algunas
otras diferencias entre la interfaz Comparable y Comparator que estudiaremos en la
Tabla de comparación.
Bases Para la
Comparable Comparator
Comparación
Básico La interfaz comparable permite La interfaz del Comparator permite
solo una secuencia de clasificación. múltiples secuencias de
clasificación.
Paquetes La interfaz comparable está La interfaz del Comparator está
presente en el paquete java.lang. presente en el paquete java.util.
Métodos La interfaz Comparable contiene La interfaz del Comparator
solo un método contiene dos métodos.
public int compareTo (objeto obj); public int compare (Objeto obj1,
Objeto obj2)
boolean equals (Object obj)
Implementació La interfaz comparable es La interfaz del Comparator se
n implementada por la clase cuyos implementa mediante una clase
objetos se van a comparar. separada en lugar de la clase cuyos
objetos se van a comparar.
Comparación El método compareTo (Object obj) El método de compare (Objeto
compara el objeto que se utiliza obj1, Objeto obj2) compara los
para invocar el método con el objetos especificados que se pasan
objeto especificado que se pasa al al método.
método.
List/Array Cuando se debe comparar una lista Cuando se debe comparar una lista
de objetos de tipo Comparable, la de objetos del tipo Comparator, la
clase Collection proporciona un clase Collection proporciona un
método, por ejemplo, método, es decir,
Collections.sort (List lst). Collections.sort (List, Comparator).
Definición de Comparable
Comparable es una interfaz que está disponible en el paquete java.lang. La clase
implementa la interfaz del Comparable, para ordenar sus objetos en orden natural.
Los objetos se clasifican en orden natural significa que los objetos se comparan por
sus valores ASCII. Las clases que implementan la interfaz Comparable son las
clases Byte, Character, Double, Float, Long, Short, String y Integer. Incluso la clase
Date y Calendar también implementan la interfaz Comparable.
La interfaz Comparable contiene solo un método que es CompareTo (objeto obj).
Este método compara el objeto utilizado para invocar el método con el objeto
especificado en el parámetro. La sintaxis del método es la siguiente:
Definición de Comparator
Comparator es una interfaz que está disponible en el paquete java.util. La interfaz
Comparator no se implementa en la clase cuyos objetos se van a comparar, sino
que la clase separada implementa la interfaz Comparator para que la lógica de
clasificación se aplique a cada elemento de datos del objeto en una clase diferente.
Comparator contiene dos métodos de la siguiente manera:
public int compare (Object obj1, Object obj2) y boolean equals (Object obj)
El método compare() anterior compara el primer objeto obj1 con el segundo objeto
obj2. El método de compare( ) devuelve 0 cuando el objeto comparado por el
método contiene el mismo valor, devuelve el valor entero negativo si el objeto obj1
es más pequeño que el objeto obj2 y devuelve el valor entero positivo si el objeto
obj1 tiene un valor mayor en comparación al objeto obj2.
El método equals() comprueba si el objeto especificado es igual al objeto que invoca.
El método equals() devuelve verdadero si los dos objetos comparados son iguales;
de lo contrario, devuelve falso. La clase Collections proporciona el método para
ordenar los elementos de tipo List y Comparator. Los elementos de la lista de los
tipos Comparator se ordenan mediante el método Collections.sort(List, Comparator).
Diferencias clave entre comparable y Comparator
1. La interfaz comparable permite una secuencia de clasificación única, lo que significa
que puede comparar solo un elemento de datos único del objeto en el método
compareTo(). Por otro lado, la interfaz Comparator permite múltiples secuencias de
clasificación, lo que significa que puede comparar múltiples elementos de datos del
objeto.
2. La interfaz Comparable es implementada por la clase cuyos objetos se van a
comparar porque la lógica de clasificación se define dentro de la misma clase. Por
otro lado, la clase cuyos objetos se van a comparar no implementa la interfaz
Comparator porque la lógica de clasificación se define en clases separadas donde
cada clase define la clasificación en un solo elemento de datos del objeto y estas
clases de definición implementan la interfaz Comparator.
3. La interfaz Comparable se encuentra dentro del paquete java.lang, mientras que la
interfaz Comparator se encuentra dentro del paquete java.util.
4. La interfaz Comparable declara solo un método que es compareTo(Object obj)
mientras que la interfaz Comparator declara dos métodos que son, compare(Object
obj1, Object obj2) y equals(Object obj).
5. El método compareTo(Object obj) en Comparable compara el método que invoca el
objeto con el objeto especificado pasado al método, mientras que el método
compare(Object obj1, Object obj2) de Comparator compara los objetos obj1 con obj2
que se pasan al método.
6. La clase Collections proporciona un método de ordenación "Collections.sort(List lst)"
para ordenar los objetos del tipo Comparable. La clase Collections proporciona el
método de ordenación Collections.sort(List, Comparator) para ordenar los objetos de
tipo Comparator.
Conclusión:
Si desea ordenar los objetos en el orden natural, puede usar la interfaz Comparable
de lo contrario, si desea ordenar los objetos en función de cualquier atributo, se
utiliza la interfaz Comparator.
Fuente:
https://techdifferences.com/difference-between-comparable-and-comparator-in-java.html
1. Comparable
2. comparador
// Constructor
public Movie(String nm, double rt, int yr)
{
this.name = nm;
this.rating = rt;
this.year = yr;
}
// Driver class
class Main
{
public static void main(String[] args)
{
ArrayList<Movie> list = new ArrayList<Movie>();
list.add(new Movie("Force Awakens", 8.3, 2015));
list.add(new Movie("Star Wars", 8.7, 1977));
list.add(new Movie("Empire Strikes Back", 8.8, 1980));
list.add(new Movie("Return of the Jedi", 8.4, 1983));
Collections.sort(list);
Output:
Movies after sorting:
Usando Comparator
A diferencia de Comparable, Comparator es externo al tipo de elemento que
estamos comparando. Es una clase separada. Creamos múltiples clases
separadas (que implementan Comparator) para comparar por diferentes miembros.
La clase Collections tiene un segundo método sort() y toma Comparator. El método
sort() invoca compare() para ordenar objetos.
Para comparar películas por calificación, debemos hacer 3 cosas:
1. Cree una clase que implemente Comparator (y, por lo tanto, el método
compare() que realiza el trabajo que anteriormente realizaba
compareTo()).
2. Cree una instancia de la clase Comparator.
3. Llame al método sort() sobrecargado, dándole tanto la lista como la
instancia de la clase que implementa Comparator.
// Constructor
public Movie(String nm, double rt, int yr)
{
this.name = nm;
this.rating = rt;
this.year = yr;
}
// Driver class
class Main
{
public static void main(String[] args)
{
ArrayList<Movie> list = new ArrayList<Movie>();
list.add(new Movie("Force Awakens", 8.3, 2015));
list.add(new Movie("Star Wars", 8.7, 1977));
list.add(new Movie("Empire Strikes Back", 8.8, 1980));
list.add(new Movie("Return of the Jedi", 8.4, 1983));
Producción:
Ordenado por calificación
8.3 El despertar de la fuerza 2015
8.4 El retorno del Jedi 1983
8.7 Star Wars 1977
8.8 El imperio contraataca 1980
Fuente:
https://www.geeksforgeeks.org/comparable-vs-comparator-in-java/
Diferencia entre comparable y
comparador
En Java, puede escribir sus propios programas si desea ordenar una lista de
elementos. Es posible que tenga una clase de colección como ArrayList o
HashSet. En este caso, si desea ordenar los objetos almacenados en las clases,
podría ser difícil al escribir programas complejos.
Para ayudarlo a clasificar los elementos de una colección, Java proporciona dos
interfaces. Son Comparable y Comparator. La interfaz Comparable le proporcionará
una técnica única para ordenar los elementos. Por otro lado, la interfaz de
Comparator te ofrece diferentes formas de ordenar los elementos.
En este artículo, discutiremos las aplicaciones y las diferencias entre las dos
interfaces.
Pero cuando hace que un elemento de una colección sea comparable, solo tendrá
una oportunidad para implementar el método compareTo(). Entonces, puede ordenar
los elementos por un solo criterio, como Autor del libro.
Ejemplo:
//Java Program Example for Comparable
import java.io.*;
import java.util.*;
//Variable Declaration
private String name;
private int age;
private int bill;
//Customer Constructor
PRODUCCIÓN:
Customers after sorting on Age:
Customer 2 14 275
Customer 5 23 5
Customer 4 25 99
Customer 1 39 49
Customer 3 75 12
public int compare (Object obj1, Object obj2): compara el primer y el segundo
objeto que se le pasan.
public boolean equals (elemento de objeto): este método compara el objeto
actual con el otro objeto que se especifica en el método.
import java.io.*;
import java.util.*;
//Variable Declaration
//function ends
//Customer Constructor
class Main
{
public static void main (String[] args) {
Collections.sort(list);
//Sorting on Age
//Sorting on Name
PRODUCCIÓN:
Comparador vs Comparable
Base de
Comparable Comparator
Comparación
Número de Le ofrece con una sola técnica de Esta interfaz le brinda múltiples
técnicas de clasificación. Por ejemplo, puede técnicas para ordenar elementos.
clasificación ordenar los elementos en función
de una sola propiedad como ID o
nombre.
Ordenar Es útil para objetos que tienen un Es útil para objetos que pueden no
orden natural. Por ejemplo, tener un orden natural.
número de serie de los empleados.
Paquete La interfaz está presente en el Esto está presente en el paquete
paquete java.lang java.util
Métodos Esta interfaz tiene el int público Esta interfaz tiene el método public
compareTo() para ordenar int compare() y boolean equals()
elementos
Procedimiento En compareTo(Object obj), el Aquí, en el método
de comparación objeto que invoca el método se compare(Object obj1, Object obj2),
compara con el objeto pasado en se comparan ambos objetos que se
el método pasan a este método
Efecto en la Aquí la clase original se ve afectada Esta interfaz no modifica la clase
clase original y se modifica. Esto se debe a que la original. Aquí, la interfaz es
clase implementa la interfaz cuyos implementada por una clase
objetos desea comparar. separada en lugar de la original.
Elementos de La clase Collection le proporciona La clase Collection le proporciona
las lista Collections.sort(List) para Collections.sort(List, Comparator)
comparar elementos de lista de para ordenar los elementos de la
tipo Comparable. lista que tienen el tipo Comparator
Conclusión
Fuente:
https://www.stechies.com/difference-between-comparable-comparator/
Comparable y Comparator en Java
Visión general
Todos estamos familiarizados con la clasificación de datos de tipos de datos primitivos
como int, String, char, etc. Podemos pasar la matriz al método Arrays.sort() directamente,
y Java se encarga de clasificar esos valores porque Java sabe cómo ordenar números,
caracteres o cadenas. Pero, ¿qué pasa con los objetos personalizados que creamos
como Student, Employee, etc.? Java no sabe cómo ordenar estos objetos personalizados, y
necesitamos proporcionar la lógica para ordenar estos objetos personalizados
explícitamente.
Java proporciona dos interfaces, Comparable y Comparator, que se pueden usar para
ordenar objetos personalizados y objetos basados en varios miembros de datos.
Alcance
En este artículo, comprenderemos las interfaces Comparable y Comparator y cómo
se utilizan para ordenar una colección de objetos en Java.
Aprenderemos sobre las operaciones proporcionadas por las
interfaces Comparable y Comparator con ejemplos.
Introducción
Comparable y Comparator, está claro por el nombre que estos se usan para comparar
cosas. En Java, puede ser un valor o un objeto. Pero, ¿en qué se diferencian unos de
otros? Este artículo explicará el funcionamiento de Comparable y Comparator con un
ejemplo en tiempo real.
Considere crear una API REST (la API es responsable de la comunicación entre los sistemas
informáticos) que devuelva la lista de superhéroes del servidor. A continuación, se
muestran los casos de uso que necesitamos.
class SuperHero {
private final String id;
private final String name;
private final int age;
/* class constructor */
public SuperHero(String id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
@Override
public String toString() {
return String.format("ID: %s | name: %s | Age: %d", id,
name, age);
}
}
Comparable se usa para ordenar objetos por orden natural o predeterminado, lo que
significa que el objeto mismo sabe cómo debe ordenarse. Ejemplo: Los
objetos SuperHero deben ordenarse por id.
Comparable proporciona una sola secuencia de clasificación. Significa que los objetos se
pueden ordenar en función de un solo miembro de datos. Ejemplo: el objeto SuperHero se
puede ordenar en función de un solo atributo como id, nombre o edad.
Sintaxis
Sintaxis
@Override
public String toString() {
return String.format("ID: %s | Name: %s | Age: %d", id,
name, age);
}
}
Collections.sort(superHeroes);
/* printing result */
superHeroes.forEach(superHero ->
System.out.println(superHero.toString()));
}
}
Salida
Explicación
Pero espera, esto es lo que hace la interfaz Comparable. Entonces, ¿por qué necesitamos
la interfaz Comparator? Si una clase implementa la interfaz Comparable, entonces es
consciente de cómo ordenarse porque la propia clase ha implementado el método
compareTo() . Esto se denomina orden predeterminado. Comparador se usa
para pedidos personalizados donde la clase desconoce la lógica de pedido.
Sintaxis
El método compare() acepta dos objetos como parámetros de entrada y devuelve un valor
entero.
Sintaxis
Comparator decide el orden de clasificación en función del valor entero devuelto por
el método compare() .
Ejemplo
Comparator<SuperHero> ageComparator =
(s1, s2) -> s1.getAge() - s2.getAge();
El método equals() se puede usar para verificar si un objeto y el comparator son iguales, es
decir; este método puede devolver verdadero solo si ambos objetos son comparators e
imponen el orden exacto. El método equals() acepta exactamente un objeto como entrada
y devuelve un valor booleano.
Sintaxis
comparator1.equals(comparator2);
El método equals() se puede invocar en cualquier instancia del comparator y acepta otra
instancia del comparator como entrada.
Ejemplo
@Override
public int compare(final SuperHero s1, final SuperHero s2) {
return s1.getAge() - s2.getAge();
}
};
Comparator<SuperHero> ageComparator
= (s1, s2) -> s1.getAge() - s2.getAge();
Comparator<SuperHero> nameComparator
= (s1, s2) -> s1.getName().compareTo(s2.getName());
System.out.println(comparator.equals(ageComparator));
System.out.println(comparator.equals(nameComparator));
Producción
true
false
Explicación
Validar el ejemplo
Sintaxis
comparing()
Example
superHeroes.sort(
Comparator.comparing(SuperHero::getName)
.thenComparing(SuperHero::getAge,
Comparator.reverseOrder())
);
System.out.println(superHero.toString()));
}
}
Output
superHeroes.sort(nameComparator);
}
superHeroes.sort(ageComparator);
}
System.out.println(superHero.toString()));
System.out.println("");
System.out.println(superHero.toString()));
}
}
Producción:
Explicación
Creamos nameComparator y comparator, que ordenan los objetos SuperHero por nombre
y edad, respectivamente. Los comparadores se crean usando expresiones lambda porque
Comparator es una interfaz funcional.
Una interfaz funcional es una interfaz que contiene exactamente un método abstracto.
También se denomina Interfaces de Método Abstracto Único (SAM). Puede tener
cualquier número de métodos predeterminados(default).
Comparable Comparator
Comparable es una interfaz en Java. Comparator es una interfaz funcional en
Java.
Comparable proporciona el método Comparator proporciona el método
compareTo() para ordenar objetos. compare() para ordenar objetos.
Comparable es parte del paquete Java.lang. Comparator es parte del paquete java.util.
Comparable se puede utilizar para pedidos Comparator se puede utilizar para pedidos
naturales o predeterminados. personalizados.
Comparable proporciona una única secuencia Comparator proporciona múltiples
de clasificación. Ej: Ordenar por id o nombre secuencias de clasificación. Ej. Ordenar por id
y nombre.
Comparable modifica la clase que lo Comparator no modifica ninguna clase.
implementa.
Fuente:
https://www.scaler.com/topics/java/comparable-and-comparator-in-java/
Comparable Vs Comparador En Java
Las interfaces Comparable y Comparator se utilizan para realizar
operaciones de clasificación en la colección de objetos. Java también
proporciona algunos métodos integrados para ordenar una matriz de tipos
primitivos o una matriz/lista de elementos de la clase Wrapper. Pero
cuando se trata de la clasificación de objetos de clase personalizados, se
utilizan las interfaces java.lang.Comparable y java.util.Comparator.
import java.util.*;
public class Main {
Producción
import java.util.*;
class Student {
private int id;
private String name;
private int age;
@Override
//Override toString method to return Student
details
public String toString() {
return "[id=" + this.id + ", name=" + this.name
+ ", age=" + this.age +"]";
}
Producción
Interfaz comparable
Nota:
Al implementar la interfaz Comparable, podemos tener una clasificación
predeterminada y no podemos cambiarla dinámicamente. Por ejemplo, en
el código a continuación, hemos realizado la clasificación según la
identificación del estudiante y si queremos ordenar los elementos según el
nombre del estudiante, no podemos hacerlo.
import java.util.*;
@Override
//Override compareTo method to customizing sorting
algorithm
public int compareTo(Student stu) {
return (this.id - stu.id);
}
@Override
//Override toString method to return Student
details
public String toString() {
return "[id=" + this.id + ", name=" + this.name
+ ", age=" + this.age +"]";
}
Producción
List before sorting:
[id=4, name=Amani, age=33]
[id=3, name=Swati, age=33]
[id=2, name=Prabhjot, age=31]
List after sorting:
[id=1, name=Himanshi, age=32]
[id=2, name=Prabhjot, age=31]
[id=3, name=Swati, age=33]
[id=4, name=Amani, age=33]
Interfaz Comparator
Al igual que la interfaz Comparable, la interfaz Comparator también se usa
para ordenar una colección de objetos personalizados y se define en el
paquete java.util. Su método compare (Object obj1, Object obj2) debe
implementarse. El método compare(Object obj1,Object obj2) debe
implementarse de tal manera que devuelva un valor int negativo, cero o
un valor int positivo si el primer objeto/argumento es menor, igual o
mayor que el segundo. objeto/argumento.
class Student {
private int id;
private String name;
private int age;
//Compare based on id
public static Comparator<Student> IdComparator =
new Comparator<Student>() {
@Override
public int compare(Student stu1, Student stu2)
{
return (int) (stu1.getId() - stu2.getId());
}
};
@Override
public int compare(Student stu1, Student stu2)
{
return
stu1.getName().compareTo(stu2.getName());
}
};
@Override
//Override toString method to return Student
details
public String toString() {
return "[id=" + this.id + ", name=" + this.name
+ ", age=" + this.age +"]";
}
Producción
List before sorting:
[id=1, name=Himanshi, age=32]
[id=4, name=Amani, age=33]
[id=3, name=Swati, age=33]
[id=2, name=Prabhjot, age=31]
List after sorting by Student Id:
[id=1, name=Himanshi, age=32]
[id=2, name=Prabhjot, age=31]
[id=3, name=Swati, age=33]
[id=4, name=Amani, age=33]
List after sorting by Student Name:
[id=4, name=Amani, age=33]
[id=1, name=Himanshi, age=32]
[id=2, name=Prabhjot, age=31]
[id=3, name=Swati, age=33]
import java.util.*;
class NameComparator implements Comparator<Student>{
public int compare(Student stu1,Student stu2){
return stu1.name.compareTo(stu2.name);
}
}
Fuente:
https://www.w3schools.blog/comparable-comparator-java
Comparable y Comparador en Java:
diferencia entre ellos
Diferencia clave entre comparable y comparador en Java
Comparable Comparator
Comparable proporciona el método Comparator proporciona el método
compareTo() para ordenar elementos en compare() para ordenar elementos en Java.
Java.
La interfaz Comparable está presente en el La interfaz del Comparator está presente en
paquete java.lang. el paquete java.util.
La lógica de ordenación debe estar en la La lógica de ordenación debe estar en una
misma clase cuyo objeto va a ordenar. clase separada para escribir una ordenación
diferente basada en diferentes atributos de
objetos.
La clase cuyos objetos desea ordenar debe La clase, cuyos objetos desea ordenar, no
implementar una interfaz Comparable. necesita implementar la interfaz Comparator.
Proporciona secuencias de ordenación Proporciona múltiples secuencias de
individuales. ordenación.
Este método puede clasificar los datos según Este método ordena los datos según el orden
el orden de clasificación natural. de clasificación personalizado.
Afecta a la clase original. es decir, se altera la No afecta a la clase original, es decir, la clase
clase real. real no se altera.
CompareTo():
El método CompareTo() se utiliza para realizar una clasificación natural en
cadenas. El significado de clasificación natural es el orden de clasificación que
se aplica al objeto, por ejemplo, orden numérico para clasificar enteros, orden
alfabético para cadenas, etc.
Producción:
Producción
Compare():
Compare() le permite ordenar objetos. Para hacer esto, debe crear una clase que
implemente la interfaz Comparator. Después de esto, debe sobrescribir el
método de compare.
En la sintaxis anterior, obj1 y obj2 son dos objetos que debe comparar utilizando
el método compare().
Producción:
// as 30 equals 30,
// Output will be zero
System.out.println(Integer.compare(p, q));
int r = 20;
int s = 7;
// as 15 is greater than 8,
// Output will be a value greater than zero
System.out.println(Integer.compare(r, s));
}
}
Producción:
-1
0
1
equals():
El método equals() verifica si el objeto numérico es igual al objeto que se pasa
como argumento o no.
System.out.println(p.equals(q));
System.out.println(p.equals(r));
System.out.println(p.equals(s));
}
}
Producción
falso
verdadero
falso
Fuente:
https://www.guru99.com/comparable-vs-comparator-java.html