Comparable和Comparator都是来做排序
Comparable自然排序
此接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的 compareTo 方法被称为它的自然比较方法。 实现此接口的对象列表(和数组)可以通过 Collections.sort(和 Arrays.sort)进行自动排序。实现此接口的对象可以用作有序映射中的键或有序集合中的元素,无需指定比较器。
package com. lotus. java ;
public class Product implements Comparable {
private String name;
private double price;
public Product ( String name, double price) {
this . name = name;
this . price = price;
}
public Product ( ) {
}
public String getName ( ) {
return name;
}
public void setName ( String name) {
this . name = name;
}
public double getPrice ( ) {
return price;
}
public void setPrice ( double price) {
this . price = price;
}
@Override
public String toString ( ) {
return "Product{" +
"name='" + name + '\'' +
", price=" + price +
'}' ;
}
@Override
public int compareTo ( Object o) {
if ( o == this ) {
return 0 ;
}
if ( o instanceof Product ) {
Product product = ( Product ) o;
int compare = Double . compare ( this . price, product. price) ;
if ( compare != 0 ) {
return compare;
}
return this . name. compareTo ( product. name) ;
}
throw new RuntimeException ( "类型不匹配" ) ;
}
}
public class ComparableTest {
@Test
public void test1 ( ) {
String [ ] arr = new String [ ] { "Water" , "Dizzy" , "Edison" , "Tye" , "Lucy" } ;
Arrays . sort ( arr) ;
for ( String s : arr) {
System . out. println ( s) ;
}
}
@Test
public void test2 ( ) {
Product [ ] arr = new Product [ 5 ] ;
arr[ 0 ] = new Product ( "HuaweiMate50pro" , 6299 ) ;
arr[ 1 ] = new Product ( "XiaoMi13pro" , 4999 ) ;
arr[ 2 ] = new Product ( "Iphone14pro" , 8999 ) ;
arr[ 3 ] = new Product ( "VivoX90pro" , 5999 ) ;
arr[ 4 ] = new Product ( "HonorMagic4" , 6299 ) ;
Arrays . sort ( arr) ;
for ( Product product : arr) {
System . out. println ( product) ;
}
}
}
Comparator定制排序
强行对某个对象 collection 进行整体排序 的比较函数。可以将 Comparator 传递给 sort 方法(如 Collections.sort 或 Arrays.sort),从而允许在排序顺序上实现精确控制。还可以使用 Comparator 来控制某些数据结构(如有序 set或有序映射)的顺序,或者为那些没有自然顺序的对象 collection 提供排序 创建自定义比较器类:创建一个类实现 Comparator 接口,并实现 compare() 方法。在该方法中,根据自定义的比较逻辑返回两个对象的大小关系。 使用 Collections.sort() 方法:通过传入一个 List 对象和一个自定义比较器对象,可以按照自定义规则对 List 中的元素进行排序。 使用 Arrays.sort() 方法:类似地,通过传入一个数组和一个自定义比较器对象,可以对数组中的元素进行排序。
@Test
public void test1 ( ) {
Product [ ] arr = new Product [ 5 ] ;
arr[ 0 ] = new Product ( "HuaweiMate50pro" , 6299 ) ;
arr[ 1 ] = new Product ( "XiaoMi13pro" , 4999 ) ;
arr[ 2 ] = new Product ( "Iphone14pro" , 8999 ) ;
arr[ 3 ] = new Product ( "VivoX90pro" , 5999 ) ;
arr[ 4 ] = new Product ( "HonorMagic4" , 6299 ) ;
Arrays . sort ( arr, new Comparator < Product > ( ) {
@Override
public int compare ( Product o1, Product o2) {
int value = Double . compare ( o1. getPrice ( ) , o2. getPrice ( ) ) ;
if ( value == 0 ) {
return o1. getName ( ) . compareTo ( o2. getName ( ) ) ;
}
return - value;
}
} ) ;
for ( Product product : arr) {
System . out. println ( product) ;
}
}
对比两种排序