Общие библиотеки классов Java Basic Tutorial 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()
классом, будет вызываться автоматически, чтобы судить о соотношении размеров объектов, чтобы они были отсортированы по цене от низкой к высокой.Book
compareTo()
В 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
Интерфейсы обычно используются, когда вам нужно динамически изменить параметры сортировки или сравнить объекты неродных классов.
![](https://img-blog.csdnimg.cn/fb1675ea0fe24c47b2b32baf16af9fbe.gif)