1. Java比较器简介

  • 在Java中经常会涉及到对象数组的排序问题,那么就涉及到对象之间的比较问题
  • Java实现对象排序的方式有两种

    • 自然排序:java.lang.Compareable
    • 定制排序:java.lang.Comparator

2. Compareable接口的使用

  • String、包装类等实现了Compareable接口,重写了compareTo()方法,给出了比较两个对象大小的方式
  • 重写规则:

    • 如果当前对象this大于形参对象obj,则返回正整数
    • 如果当前对象this小于形参对象obj,则返回负整数
    • 如果当前对象this等于形参对象obj,则返回零。
  • 实现Compareable接口的对象列表(和数组)可以通过Collections.sort()Arrays.sort()进行自动排序。实现此接口的对象可以用作有序映射中的键或有序集合中的元素,无需指定比较器。
  • 对于类C的每一个e1e2来说,当且仅当e1.compareTo(e2) == 0e1.equals(e2)具有相同的boolean值时,类C的自然排序才叫做与euqals一致。建议最好使自然排序与equals()一致
public class Goods implements Comparable {
    private String name;
    private int price;

    public Goods() {

    }

    public Goods(String name, int price) {
        this.name = name;
        this.price = price;
    }

    // 指明商品比较大小的方式
    @Override
    public int compareTo(Object o) {
        if (o instanceof Goods) {
            Goods goods = (Goods) o;
            if (this.price > goods.price) {
                return 1;
            } else if (this.price < goods.price) {
                return -1;
            } else {
                return 0;
            }
        }
        throw new RuntimeException("传入的数据类型不一致");
    }

    @Override
    public String toString() {
        return "Goods{" +
                "name='" + name + '\'' +
                ", price=" + price +
                '}';
    }
}
@Test
public void test2() {
    Goods[] arr = new Goods[4];
    arr[0] = new Goods("Lenove", 34);
    arr[1] = new Goods("Dell", 43);
    arr[2] = new Goods("Xiaomi", 12);
    arr[3] = new Goods("Huawei", 100);
    Arrays.sort(arr);
    System.out.println(Arrays.toString(arr));
}

运行结果:

[Goods{name='Xiaomi', price=12}, Goods{name='Lenove', price=34}, Goods{name='Dell', price=43}, Goods{name='Huawei', price=100}]

Goods类中实现了Compareable接口中的方法后,可以使用数组工具类对其进行自然排序

3. Comparator实现定制排序

  • 当元素的类型没有实现java.lang.Compareable接口而又不方便修改代码,或者实现了java.lang.Compareable接口的排序规则不适合当前需求,那么可以考虑使用Comparator的对象来排序,强行对多个对象进行整体排序的比较
  • 重写compare(Object o1, Object o2)方法,比较o1o2大小:如果方法返回正整数,则o1大于o2;如果返回0,表示相等;如果返回负整数,表示o1小于o2
  • 可以将Comparator传递给sort()方法,从而允许在排序顺序上实现精确控制
  • 还可以使用Comparator来控制某些数据结构(如有序set或有序映射)的顺序,或者为那些没有自然顺序的对象collection提供排序
@Test
public void test3() {
    String[] arr = new String[]{"AA", "CC", "MM", "ZZ", "DD", "BB"};
    Arrays.sort(arr, new Comparator<String>() {
        @Override
        public int compare(String o1, String o2) {
            return -o1.compareTo(o2);
        }
    });
    System.out.println(Arrays.toString(arr));
}

运行结果:

[ZZ, MM, DD, CC, BB, AA]

通过Comparator接口,将String中默认的从大到小排序反过来

最后修改:2021 年 03 月 18 日
如果觉得我的文章对你有用,请随意赞赏