一文搞定Comparable和Comparator

一文搞定Comparable和Comparator

平常求赞,感谢老板。

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

1、Comparable

(1)、定义

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

/**
 * 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);

翻一下上面的注解:less

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

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

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

(2)、举个栗子

Integerspa

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(和接口定义的方法含义一致)code

(3)、场景

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

2、Comparator

(1)、定义

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

接口Comparator<T>,实现该接口并在实现时指定类型,重写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方法,必须传入比较器

3、最后

总结内容

更多资源: 实际上是白羊

欢迎star

平常求赞

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

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

相关文章
相关标签/搜索