Comparador de Tutorial Básico de Bibliotecas de Clases Comunes de Java
1️⃣ Comparador: Comparable
En el artículo anterior, presentamos las matrices y las clases de herramientas de manipulación de matrices Arrays
, y aprendimos que las matrices en realidad se dividen en dos tipos de uso: matrices ordinarias y matrices de objetos. Las matrices ordinarias se pueden ordenar directamente (clasificación de llamadas) de acuerdo con la relación de tamaño de los datos, mientras que las matrices de objetos almacenan datos de dirección en sí mismas, por lo que es imposible implementar la clasificación de acuerdo con la relación de tamaño. Sin embargo, un método (clasificación de matriz de objetos:) todavía está sobrecargado en la clase, que puede ordenar directamente las Arrays.sort
matrices Arrays
de sort()
objetos public static void sort(Object[] a)
.
Pero si desea utilizar sort()
el método para ordenar, debe haber un requisito previo: la clase donde se encuentra el objeto debe implementar Comparable
la interfaz, de lo contrario, se producirá una excepción cuando se ejecute el código ClassCastException
. La interfaz Comparable
es una especie de comparador, que se define de la siguiente manera.
public interface Comparable<T>{
public int compareTo(T o);
}
Comparable
Solo hay un método definido en la interfaz , compareTo()
que devuelve un int
tipo de datos, y los desarrolladores solo necesitan devolver tres resultados al anular este método: 1(>0)
, -1(<0)
, 0(=0)
.
Al explicar String
el método de operación de la clase, he explicado compareTo()
el método. De hecho, String
la clase, clase, Integer
etc., todos implementan Comparable
la interfaz, es decir, las matrices de objetos de estas clases pueden usar directamente Arrays.sort()
el método para ordenar la matriz de objetos.
// 范例 1: 实现对象数组排序
package com.xiaoshan.demo;
import java.util.Arrays;
class Book implements Comparable<Book>{
//实现比较器
private String title;
private double price;
public Book(String title,double price){
this.title = title;
this.price = price;
}
@Override
public String toString(){
return "书名:"+this.title+",价格:"+this.price+"\n";
}
@Override
public int compareTo(Book o){
// Arrays.sort()会自动调用此方法比较
if (this.price > o.price){
return 1;
}else if (this.price < o.price){
return -1;
}else{
return 0;
}
}
}
public class TestDemo{
public static void main(String[] args) throws Exception{
Book books []= new Book []{
new Book("Java开发实战经典",79.8),
new Book("JavaWEB开发实战经典",69.8),
new Book("Oracle开发实战经典",99.8),
new Book("Android开发实战经典",89.8)
};
Arrays.sort(books); //对象数组排序
System.out.println(Arrays.toString(books));
}
}
Resultado de la ejecución del programa:
[书名:JavaWEB 开发实战经典,价格:69.8
,书名: Java开发实战经典,价格:79.8
,书名:Android 开发实战经典,价格:89.8
,书名: Oracle开发实战经典,价格:99.8]
Este programa Book
implementa Comparable
la interfaz cuando se define la clase, lo que significa que los objetos de esta clase pueden implementar la operación de clasificación de la matriz de objetos. Al usar el método en la clase principal , el método anulado Arrays.sort()
por la clase se llamará automáticamente para juzgar la relación de tamaño de los objetos, de modo que se clasificarán según el precio de menor a mayor.Book
compareTo()
Hay dos implementaciones de comparadores en Java, entre las cuales Comparable
se encuentra la interfaz de comparación más utilizada. En el desarrollo real, siempre que se ordene la matriz de objetos, Comparable
se debe dar prioridad a la implementación de la interfaz.
2️⃣ Comparador al rescate: Comparador
El comparador implementado por Comparable
la interfaz es un uso común, pero desde otra perspectiva, si desea utilizar el Comparable
comparador, significa que debe considerar los requisitos de clasificación al definir la clase. Pero, ¿qué sucede si una determinada definición de clase no implementa Comparable
la interfaz, pero qué debo hacer si es necesario ordenar la matriz de objetos cuando la definición de clase no se puede modificar? Por esta razón, Java proporciona otro comparador: interfaz ( Comparator
comparador de rescate), que se define de la siguiente manera.
@FunctionalInterface
public interface Comparator<T>{
public int compare(T o1, T o2);
public boolean equals(Object obj);
}
A través de la definición, se puede encontrar que la Comparator
declaración de anotación " " se usa en la interfaz @Functionallnterface
, por lo que esta interfaz es una interfaz funcional. Esta interfaz proporciona un compare()
método que devuelve tres resultados: 1(>0)
, -1(<0)
, 0
.
@Functionallnterface
Algunos amigos pueden tener dudas. Si la anotación " " se usa en la interfaz definida , entonces solo debería haber un método abstracto en la interfaz. ¿Por qué se pueden definir dos aquí?
Cabe señalar que, aunque Comparator
se definen dos métodos abstractos en la interfaz, la subclase solo necesita anular el método al anular compare()
, y equals()
dicho método Object
ya tiene una implementación predeterminada (comparación de direcciones) en la clase, es decir, Object
el método en la clase no pertenece al alcance limitado.
Si desea utilizar Comparator
la interfaz para implementar la operación de clasificación de la matriz de objetos, también debe reemplazar java.util.Arrays
el método de clasificación en la clase. El método de clasificación de la matriz de objetos es:
public static<T> void sort(T[] a, Comparator<? super T> c);
// 范例 2: 利用Comparator 接口实现对象数组排序—— 定义一个类,此类不实现比较器接口
package com.xiaoshan.demo;
class Book {
private String title;
private double price;
public Book(){
}
public Book(String title, double price){
this.title = title;
this.price = price;
}
@Override
public String toString(){
return "书名:" + this.title + ",价格:" + this.price + "\n";
}
public void setPrice(double price){
this.price = price;
}
public void setTitle(String title){
this.title = title;
}
public double getPrice(){
return price;
}
public String getTitle(){
return title;
}
}
Suponga que Book
no hay requisitos de diseño para ordenar en el diseño inicial de la clase y no se puede cambiar. Sin embargo, con la profundización del desarrollo, existe un requisito para clasificar las matrices de objetos, por lo que en este momento puede usar Comparator
la interfaz para Book
diseñar una clase de regla de clasificación para la clase: BookComparator
.
class BookComparator implements Comparator<Book>{
@Override
public int compare(Book o1, Book o2){
if (o1.getPrice() > o2.getPrice()){
return 1;
}else if (o1.getPrice() < o2.getPrice()){
return -1;
}else{
return 0;
}
}
}
Este programa define una BookComparator
clase de programa de comparación, por lo que Arrays.sort()
se debe pasar un objeto instanciado de esta clase al usar sort.
La siguiente prueba utiliza el comparador especificado para implementar la operación de clasificación de la matriz de objetos.
public class TestDemo {
public static void main(String[] args) throws Exception {
Book[] books = new Book [] {
new Book("Java开发实战经典",79.8),
new Book("JavaWEB开发实战经典",69.8),
new Book("'Oracle开发实战经典",99.8),
new Book("Android开发实战经典",89.8)
};
Arrays.sort(books, new BookComparator());
System.out.println(Arrays.toString(books));
}
}
Resultado de la ejecución del programa:
[ 书名:JavaWEB 开发实战经典,价格:69.8,
书名:Java开发实战经典,价格:79.8,
书名:Android开发实战经典,价格:89.8,
书名:Oracle开发实战经典,价格:99.8 ]
Usar Comparator
no es tan Comparable
conveniente como , por lo que al usar Arrays
la clase para implementar la clasificación de objetos, debe establecer explícitamente un objeto instanciado de la clase de regla de clasificación antes de poder completar normalmente la función de clasificación de la matriz de objetos.
3️⃣ La diferencia entre Comparable y Comparator
java.lang.Comparable
Las interfaces se implementan en las clases de objetos que se comparan y se utilizan para definir un ordenamiento natural entre los objetos. Tiene uncompareTo()
método que compara el orden del objeto actual con el objeto del parámetro. Las clases que implementanComparable
la interfaz pueden usar directamente algoritmos de clasificación (comoArrays.sort()
oCollections.sort()
) para clasificar.java.util.Comparator
Las interfaces son independientes de las clases de objetos que se comparan. Se utiliza para crear un solo objeto comparador e implementacompare()
métodos para definir la lógica de comparación entre diferentes objetos. Al proporcionar unComparator
objeto personalizado, se puede ordenar cualquier objeto, que es diferente del objeto mismo que implementaComparable
la interfaz.Comparator
Las interfaces generalmente se usan cuando necesita cambiar dinámicamente la intercalación o comparar objetos de clases no nativas.