Para organizar objetos del mismo tipo almacenados en una matriz o colección, los desarrolladores de Java crearon
Una de las formas más simples y efectivas de ordenar una matriz de objetos es el método
Comparable
. Declara sólo un método compareTo
:
public interface Comparable<T> {
public int compareTo(T o);
}
Una interfaz Comparable
está parametrizada por el tipo de objeto que acepta como parámetro del método compareTo
. En este caso, advertimos al compilador qué tipos de objetos vamos a comparar. Si no se cumple la condición de identidad del tipo, recibiremos un error ClassCastException
. Un método compareTo
en Java compara el objeto que llama con el objeto pasado como parámetro y devuelve un número entero como resultado de la comparación:
- positivo si el objeto que llama es más grande que el objeto pasado como parámetro;
- negativo si el objeto que llama es más pequeño que el objeto pasado como parámetro;
- nulo si los objetos son iguales.
¿Por qué se necesita el método compareTo en Java?
Un programador de Java muy a menudo tiene que lidiar con matrices y listas de objetos. Cuando se trabaja con grandes cantidades de datos, suele ser conveniente almacenarlos de forma organizada u ordenada. En primer lugar, acelera el trabajo con la colección a la hora de buscar la información necesaria y, en segundo lugar, los datos organizados se perciben visualmente mejor.sort()
de clase Arrays
, y una colección de objetos en forma de lista es un método de clase similar Collections
. Para ordenar usando estos métodos, los desarrolladores de Java nos dieron la libertad de elegir cómo especificar los criterios de ordenación: implementando la interfaz Comparable
en la clase de objetos que queremos ordenar, o usando el archivo Comparator
. En el primer caso, los métodos de clasificación aceptan un conjunto de objetos en forma de matriz o lista:
sort(T[]array)//clasificación массива
sort(List<T> list)// clasificación списка
y en el segundo, más otra implementación de la interfaz Comparator
:
sort(T[]array, Comparator <? super T> comparator)//clasificación массива
sort(List<T> list, Comparator <? super T> comparator)// clasificación списка
La interfaz Comparable
se utiliza cuando queremos establecer un orden natural (el más lógico desde nuestro punto de vista) de los objetos al ordenar. También es una forma de "conectar" el algoritmo para comparar objetos de esta clase en la etapa de diseño. Por ejemplo, utilizando la implementación de esta interfaz, se definen los criterios para el ordenamiento natural en las clases contenedoras de los principales tipos primitivos: , , Byte
, Character
, Long
, Integer
, Short
, Double
, Float
. Esto también significa que estas clases tienen un método implementado que podemos usar en el programa si es necesario. Veamos un ejemplo de comparación de cadenas para ver cómo se implementa este método en la clase . Boolean
String
compareTo
String
String str1="Аарон";
String str2="АAPOH";
String str3="аарон";
String str4="ААрон";
String str5="аАрон";
String str6="Берта";
String str7="берта";
String[] allStr=new String[]{str1,str2,str3,str4, str5,str6, str7};
Arrays.sort(allStr);
for (String s:allStr){
System.out.println(s);
}
}
Si ejecutamos este código en el método main
, obtendremos el siguiente resultado:
АAPOH
ААрон
Аарон
Берта
аАрон
аарон
берта
Como puede ver en el ejemplo de la clase String
, el método compareTo
organiza las cadenas alfabéticamente, lexicográficamente y distingue entre mayúsculas y minúsculas. Es este orden de comparación de cadenas el que los desarrolladores de la clase definen String
como natural. Para comprender más fácilmente qué es el orden lexicográfico, basta recordar cómo se organizan las palabras en los diccionarios de idiomas. Al comparar números, los objetos se ordenan en orden ascendente. Esta lógica de comparación está integrada en las clases Byte
, Character
, Long
, Integer
, Shor
, Double
, Float
.
Implementemos la comparación en nuestra clase.
Veamos un ejemplo de cómo puedes desarrollar la capacidad de comparar objetos en tu clase. Al implementar uncompareto
método Java, podemos especificar uno o más criterios para ordenar objetos y también usar métodos compareto
de las clases String
y Integer
. Por ejemplo, para los objetos de clase User
configuramos la clasificación por nombre y, en caso de nombres iguales, por edad. Los objetos se ordenarán en su orden natural (a medida que aumenta el valor). Clase User
:
public class User implements Comparable <User>{//добавляем возможность сравнивать un objetoы User
private String name;
private Integer age;
private String email;
public User(String name, int age, String email) {
this.name = name;
this.age = age;
this.email = email;
}
@Override
//реализуем метод compareTo интерфейса Comparable
public int compareTo(User o) {
//используем метод compareTo из класса String для сравнения имен
int result = this.name.compareTo(o.name);
//если имена одинаковые - сравниваем возраст,
используя метод compareTo из класса Integer
if (result == 0) {
result = this.age.compareTo(o.age);
}
return result;
}
@Override
public String toString() {
return "{" +
"name='" + name + '\'' +
", age=" + age +
", email='" + email + '\'' +
'}';
}
Probemos el funcionamiento del método compareTo
implementado en la clase User
usando el método sort
de clase Collections
:
public static void main(String[] args) {
User user = new User("andrey", 19, "andryha@mail.ru");
User user2 = new User("Олег", 25, "oleg@mail.ru");
User user3 = new User("andrey", 24,"opr@google.com");
User user4 = new User("Ígor", 16, "igor@mail.ru");
User user5 = new User("andrey", 44,"stary@google.com");
List<User> list = new ArrayList<>();
list.add(user);
list.add(user2);
list.add(user3);
list.add(user4);
list.add(user5);
System.out.println("-------до сортировки--------");
for (User u : list) {
System.out.println(u);
}
System.out.println("-------после сортировки-----");
Collections.sort(list);
for (User u : list) {
System.out.println(u);
}
}
}
}
Resultado del método main
:
-------до сортировки--------
{name='Андрей', age=19, email='andryha@mail.ru'}
{name='Олег', age=25, email='oleg@mail.ru'}
{name='Андрей', age=24, email='opr@google.com'}
{name='Игорь', age=16, email='igor@mail.ru'}
{name='Андрей', age=44, email='stary@google.com'}
-------после сортировки-----
{name='Андрей', age=19, email='andryha@mail.ru'}
{name='Андрей', age=24, email='opr@google.com'}
{name='Андрей', age=44, email='stary@google.com'}
{name='Игорь', age=16, email='igor@mail.ru'}
{name='Олег', age=25, email='oleg@mail.ru'}
Entonces, resumamos. Si eres partidario del orden en todo y quieres organizar tus objetos en una matriz o lista sin código innecesario, utiliza la interfaz Comparable
. La implementación de su método compareTo hace que sea bastante fácil crear un mecanismo para ordenar objetos de forma natural en su clase. Si tiene que trabajar con colecciones y matrices de objetos de clases estándar descritas en la biblioteca Java, utilice implementaciones listas para usar compareTo
en estas clases.
GO TO FULL VERSION