[Основное руководство по Java] (39) Общие библиотеки классов. Лекция 9: Компаратор — Объяснение Comparable и Comparator~

вставьте сюда описание изображения

1️⃣ Компаратор: Сопоставимый

В предыдущей статье мы представили массивы и классы инструментов для работы с массивами Arraysи узнали, что массивы на самом деле делятся на два типа использования: обычные массивы и массивы объектов. Обычные массивы можно напрямую сортировать (вызывать сортировку) в соответствии с отношением размера данных, в то время как массивы объектов хранят сами адресные данные, поэтому невозможно реализовать сортировку в соответствии с отношением размера. Однако в классе по-прежнему перегружен метод (сортировка массива объектов:), который может напрямую Arrays.sortсортировать массивы Arraysобъектов .sort()public static void sort(Object[] a)

Но если вы хотите использовать sort()метод для сортировки, должно быть обязательное условие: класс, в котором находится объект, должен реализовывать Comparableинтерфейс, иначе при выполнении кода возникнет исключение ClassCastException. Интерфейс Comparableпредставляет собой своего рода компаратор, который определяется следующим образом.

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

ComparableВ интерфейсе определен только один метод , compareTo()который возвращает intтип данных, и разработчикам нужно вернуть только три результата при переопределении этого метода: 1(>0), -1(<0), 0(=0).

Объясняя Stringметод работы класса, я объяснил compareTo()метод.На самом деле, Stringкласс, класс Integerи т. д. все реализуют Comparableинтерфейс, то есть массивы объектов этих классов могут напрямую использовать Arrays.sort()метод для сортировки массива объектов.

//	范例 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));
	}
}

Результат выполнения программы:

[书名:JavaWEB 开发实战经典,价格:69.8
,书名: Java开发实战经典,价格:79.8
,书名:Android 开发实战经典,价格:89.8
,书名: Oracle开发实战经典,价格:99.8]

Эта программа Bookреализует Comparableинтерфейс, когда класс определен, что означает, что объекты этого класса могут реализовать операцию сортировки массива объектов. При использовании метода в основном классе метод , переопределяемый Arrays.sort()классом, будет вызываться автоматически, чтобы судить о соотношении размеров объектов, чтобы они были отсортированы по цене от низкой к высокой.BookcompareTo()

В Java есть две реализации компараторов, среди которых Comparableнаиболее часто используемый интерфейс компаратора. В реальной разработке, пока массив объектов отсортирован, Comparableреализация интерфейса должна иметь приоритет.

2️⃣ Компаратор в помощь: Компаратор

Компаратор, реализованный интерфейсом Comparable, является обычным использованием, но с другой точки зрения, если вы хотите использовать компаратор Comparable, это означает, что вы должны учитывать требования сортировки при определении класса. Но что, если определенное определение класса не реализует Comparableинтерфейс, но что делать, если массив объектов необходимо отсортировать, когда определение класса не может быть изменено?По этой причине в Java предусмотрен еще один компаратор: интерфейс Comparator(спасательный компаратор), который определяется следующим образом.

@FunctionalInterface
public interface Comparator<T>{
    
    
	public int compare(T o1, T o2);
	public boolean equals(Object obj);
}

Через определение можно обнаружить, что Comparatorв интерфейсе используется объявление аннотации " " @Functionallnterface, поэтому этот интерфейс является функциональным интерфейсом. Этот интерфейс предоставляет compare()метод, который возвращает три результата: 1(>0), -1(<0), 0.

У некоторых друзей могут возникнуть сомнения.Если на определенном интерфейсе используется @Functionallnterfaceаннотация " " , то в интерфейсе должен быть только один абстрактный метод. Почему здесь можно определить два?

Следует отметить, что хотя Comparatorв интерфейсе определены два абстрактных метода, подклассу нужно только переопределить метод при переопределении compare(), и equals()такой метод Objectуже имеет реализацию по умолчанию (сравнение адресов) в классе, то есть Objectметод в классе не принадлежит к ограниченной области.

Если вы хотите использовать Comparatorинтерфейс для реализации операции сортировки массива объектов, вам также необходимо заменить java.util.Arraysметод сортировки в классе. Метод сортировки массива объектов:

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;
	}
}

Предположим, что Bookв исходном дизайне класса нет требований к оформлению для упорядочения и их нельзя изменить. Однако с углублением разработки возникает потребность в сортировке массивов объектов, поэтому на данный момент можно использовать Comparatorинтерфейс для Bookразработки класса правил сортировки для класса: 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;
		}
	}
}

Эта программа определяет BookComparatorкласс программы компаратора, поэтому Arrays.sort()при использовании сортировки необходимо передать экземпляр объекта этого класса.

В следующем тесте указанный компаратор используется для реализации операции сортировки массива объектов.

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));
	}
}

Результат выполнения программы:

[ 书名:JavaWEB 开发实战经典,价格:69.8,
书名:Java开发实战经典,价格:79.8,
书名:Android开发实战经典,价格:89.8,
书名:Oracle开发实战经典,价格:99.8 ]

Использование Comparatorне так Comparableудобно, как , поэтому при использовании Arraysкласса для реализации сортировки объектов необходимо явно задать инстанцируемый объект класса правил сортировки, прежде чем вы сможете нормально завершить функцию сортировки массива объектов.

3️⃣ Разница между Comparable и Comparator

  • java.lang.ComparableИнтерфейсы реализуются в классах сравниваемых объектов и используются для определения естественного порядка между объектами. У него есть compareTo()метод, который сравнивает порядок текущего объекта с объектом параметра. Классы, реализующие Comparableинтерфейс, могут напрямую использовать алгоритмы сортировки (например, Arrays.sort()или Collections.sort()) для сортировки.
  • java.util.ComparatorИнтерфейсы не зависят от сравниваемых классов объектов. Он используется для создания одного объекта сравнения и реализует compare()методы для определения логики сравнения между различными объектами. Предоставляя пользовательский Comparatorобъект, можно отсортировать любой объект, отличный от самого объекта, реализующего Comparableинтерфейс. ComparatorИнтерфейсы обычно используются, когда вам нужно динамически изменить параметры сортировки или сравнить объекты неродных классов.


Просмотрите предыдущую статью (нажмите, чтобы перейти) :
«[Основной учебник по Java] (38) Обычно используемые библиотеки классов, лекция 8: Класс операций с массивами — анализ всех методов операций в классе Arrays и разблокировка навыков работы с массивами Java~»

Продолжить чтение следующей статьи (нажмите, чтобы перейти) :
«[Основной учебник по Java] (Сорок) общих библиотек классов, десятая лекция: Механизм отражения - концепции, преимущества и недостатки, методы использования и основные принципы ~»

рекомендация

отblog.csdn.net/LVSONGTAO1225/article/details/131848594