# 4. Java 比较器
# 4.1 自然排序 java.lang.Comparable
# 4.1.1 典型实现
默认都是从小到大排列的:
- String:按照字符串中字符的Unicode值进行比较
- Character:按照字符的Unicode值来进行比较
- 数值类型对应的包装类以及 BigInteger、BigDecimal:按照它们对应的数值大小进行比较
- Boolean:true 对应的包装类实例大于 false 对应的包装类实例
- Date、Time等:后面的日期时间比前面的日期时间大
# 4.1.2 示例
Goods 类:
public class Goods implements Comparable {
private String name;
private Float price;
/**
* 比较逻辑
*/
@Override
public int compareTo(Object o) {
if (o instanceof Goods){
Goods other = (Goods)o;
if (this.price > other.price){
return 1; //大于
}else if (this.price < other.price){
return -1;//小于
}else{
return 0; //等于
}
}
throw new RuntimeException("输入的数据类型不一致");
}
//构造器、getter、setter、toString()方法略
}
测试:
@Test
public void test1(){
Goods goods1 = new Goods("苹果",220.1F);
Goods goods2 = new Goods("芒果",110.2F);
Goods[] goods = new Goods[]{goods1,goods2};
System.out.print("排序前: ");
for (Goods g:goods){
System.out.print(g + " \t");
}
System.out.println();
//排序
Arrays.sort(goods);
System.out.print("排序后: ");
for (Goods g: goods){
System.out.print(g + " \t");
}
}
结果:
# 4.2 定制排序 java.util.Comparator
# 4.2.1 说明
当元素的类型没有实现 java.lang.Comparable
接口而又不方便修改代码, 或者实现了 java.lang.Comparable
接口的排序规则不适合当前的操作,那么可以考虑使用 Comparator
的对象来排序,强行对多个对象进行整体排序的比较。
重写 ·compare(Object o1,Object o2)` 方法,比较o1和o2的大小:
- 如果方法 回正整数,则表示o1大于o2
- 如果返回0,表示相等
- 返回负整数,表示 o1小于o2。
可以将 Comparator 传递给 sort 方法(如 Collections.sort 或 Arrays.sort), 从而允许在排序顺序上实现精确控制。
还可以使用 Comparator 来控制某些数据结构(如有序 set或有序映射)的 顺序,或者为那些没有自然顺序的对象 collection 提供排序。
# 4.2.2 示例
Goods 类
public class Goods {
private String name;
private Float price;
//构造器、getter、setter、toString()方法略
}
测试:
@Test
public void test1(){
Goods goods1 = new Goods("苹果",220.1F);
Goods goods2 = new Goods("芒果",110.2F);
Goods[] goods = new Goods[]{goods1,goods2};
System.out.print("排序前: ");
for (Goods g:goods){
System.out.print(g + " \t");
}
System.out.println();
//传入一个比较器
Arrays.sort(goods, new Comparator<Goods>() {
@Override
public int compare(Goods o1, Goods o2) {
return o1.getPrice().compareTo(o2.getPrice());
}
});
System.out.print("排序后: ");
for (Goods g: goods){
System.out.print(g + " \t");
}
}