[Tutorial básico de Java] (39) Bibliotecas de clases comunes Lección 9: Comparador——Explicación de Comparable y Comparator~

inserte la descripción de la imagen aquí

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.sortmatrices Arraysde 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 Comparablela interfaz, de lo contrario, se producirá una excepción cuando se ejecute el código ClassCastException. La interfaz Comparablees una especie de comparador, que se define de la siguiente manera.

public interface Comparable<T>{
    
    
	public int compareTo(T o);
}

ComparableSolo hay un método definido en la interfaz , compareTo()que devuelve un inttipo de datos, y los desarrolladores solo necesitan devolver tres resultados al anular este método: 1(>0), -1(<0), 0(=0).

Al explicar Stringel método de operación de la clase, he explicado compareTo()el método. De hecho, Stringla clase, clase, Integeretc., todos implementan Comparablela 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 Bookimplementa Comparablela 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.BookcompareTo()

Hay dos implementaciones de comparadores en Java, entre las cuales Comparablese encuentra la interfaz de comparación más utilizada. En el desarrollo real, siempre que se ordene la matriz de objetos, Comparablese debe dar prioridad a la implementación de la interfaz.

2️⃣ Comparador al rescate: Comparador

El comparador implementado por Comparablela interfaz es un uso común, pero desde otra perspectiva, si desea utilizar el Comparablecomparador, 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 Comparablela 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 ( Comparatorcomparador 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 Comparatordeclaració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.

@FunctionallnterfaceAlgunos 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 Comparatorse definen dos métodos abstractos en la interfaz, la subclase solo necesita anular el método al anular compare(), y equals()dicho método Objectya tiene una implementación predeterminada (comparación de direcciones) en la clase, es decir, Objectel método en la clase no pertenece al alcance limitado.

Si desea utilizar Comparatorla interfaz para implementar la operación de clasificación de la matriz de objetos, también debe reemplazar java.util.Arraysel 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 Bookno 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 Comparatorla interfaz para Bookdiseñ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 BookComparatorclase 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 Comparatorno es tan Comparableconveniente como , por lo que al usar Arraysla 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.ComparableLas interfaces se implementan en las clases de objetos que se comparan y se utilizan para definir un ordenamiento natural entre los objetos. Tiene un compareTo()método que compara el orden del objeto actual con el objeto del parámetro. Las clases que implementan Comparablela interfaz pueden usar directamente algoritmos de clasificación (como Arrays.sort()o Collections.sort()) para clasificar.
  • java.util.ComparatorLas interfaces son independientes de las clases de objetos que se comparan. Se utiliza para crear un solo objeto comparador e implementa compare()métodos para definir la lógica de comparación entre diferentes objetos. Al proporcionar un Comparatorobjeto personalizado, se puede ordenar cualquier objeto, que es diferente del objeto mismo que implementa Comparablela interfaz. ComparatorLas interfaces generalmente se usan cuando necesita cambiar dinámicamente la intercalación o comparar objetos de clases no nativas.


Revisa el artículo anterior (haz clic para saltar) :
"[Tutorial básico de Java] (38) Bibliotecas de clases de uso común Lección 8: Clase de operación de arreglos——Analice todos los métodos de operación en la clase de arreglos y desbloquee las habilidades de operación de arreglos de Java~"

Continúe leyendo el siguiente artículo (haga clic para saltar) :
"[Tutorial básico de Java] (Cuarenta) Bibliotecas de clases comunes Clase diez: Mecanismo de reflexión: conceptos y ventajas y desventajas, métodos de uso y principios subyacentes~"

Supongo que te gusta

Origin blog.csdn.net/LVSONGTAO1225/article/details/131848594
Recomendado
Clasificación