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

结果:

image-20201019171708530

# 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");
    }
}
上次更新: 8/27/2021, 5:57:47 PM