一文搞定Comparable和Comparator

654 阅读3分钟

一文搞定Comparable和Comparator

日常求赞,感谢老板。

欢迎关注公众号:其实是白羊。干货持续更新中......

一、Comparable

(1)、定义

首先Comparable是Java提供的一个接口、里面只有一个方法:

/**
 * Compares this object with the specified object for order.  Returns a
 * negative integer, zero, or a positive integer as this object is less
 * than, equal to, or greater than the specified object.
 */
public int compareTo(T o);

翻一下上面的注解:

比较此对象和指定对象的顺序

  1. 当此对象小于指定对象时返回负数
  2. 当此对象等于指定对象时返回0
  3. 当此对象大于指定对象时返回正数

由此可见这个接口提供的方法可以用来比较实现了此接口的对象的顺序(“大小”),常见的如:String、Integer等类都实现了这个接口,所以这些对象都可以使用compareTo方法来进行比较。

(2)、举个栗子

Integer

public int compareTo(Integer anotherInteger) {
    return compare(this.value, anotherInteger.value);
}

public static int compare(int x, int y) {
    return (x < y) ? -1 : ((x == y) ? 0 : 1);
}

可见当此对象值<比较对象的值是返回-1,相等返回0,大于返回1(和接口定义的方法含义一致)

(3)、场景

  1. 当存储到Collection、Array中时,可以直接使用Collections和Arrays的sort方法进行排序,排序规则为元素对象重写的compareTo方法。
  2. 当这些类存储到如TreeSet或TreeMap中时,会自动根据重写的compareTo方法来进行排序存储。
  3. 实现了这个接口的类之间调用compareTo进行比较。

二、Comparator

(1)、定义

字面意思理解下,比较器,用来指定比较规则。

接口Comparator,实现该接口并在实现时指定类型,重写compare方法,就可以规定指定类型的比较规则。

(2)、举个栗子

我现在创建了一个bean叫TestBean:

@Data
public class TestBean {

    private int id;

    private String name;
}

我将要把他存放到集合中,且要根据TestBean里的id属性的值进行倒叙排序。这样就可以写个类实现Comparator接口且泛型为TestBean。

@Override
public int compare(TestBean o1, TestBean o2) {
    int id1 = o1.getId();
    int id2 = o2.getId();
    if (id1 < id2) {
        return 1;
    }
    if (id1 > id2) {
        return -1;
    }
    return 0;
}

讲下为啥这样写:

首先要知道正序情况下:<返回-1,=返回0,>返回1,这个和compareTo的比较是一样的,所以说倒序的话就是反过来:<返回1,=返回0,>返回-1

精简写法:

@Override
public int compare(TestBean o1, TestBean o2) {
    int id1 = o1.getId();
    int id2 = o2.getId();
    return id2 - id1;
}

id2-id1:如果id1<id2那id2-id1即为正数,如果id1>id2那id2-id1即为负数,刚好符合逻辑。

(3)、场景

上面例子里已经是一个场景了(集合中进行元素的自定义排序)

  1. Collections.sort()/Arrays.sort(),如果没实现Comparable,是不能直接进行排序的,这就可以在第二个参数加入实现了Comparator接口的比较器,完成自己的比较规则。
  2. List对象的sort方法,必须传入比较器

三、最后

总结内容

更多资源:其实是白羊

欢迎star

日常求赞

  • 如果你认为本文对你有帮助,还请「在看/转发/赞/star」,多谢
  • 如果你还发现了更好或不同的想法,还请在留言区不吝赐教,一起探讨交流修改,万分感谢

欢迎关注公众号:「其实是白羊」干货持续更新中......