日常求赞,感谢老板。
欢迎关注公众号:其实是白羊。干货持续更新中......
首先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);
翻一下上面的注解:
比较此对象和指定对象的顺序
由此可见这个接口提供的方法可以用来比较实现了此接口的对象的顺序(“大小”),常见的如:String、Integer等类都实现了这个接口,所以这些对象都可以使用compareTo方法来进行比较。
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(和接口定义的方法含义一致)
字面意思理解下,比较器,用来指定比较规则。
接口Comparator<T>,实现该接口并在实现时指定类型,重写compare方法,就可以规定指定类型的比较规则。
我现在创建了一个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即为负数,刚好符合逻辑。
上面例子里已经是一个场景了(集合中进行元素的自定义排序)
总结内容
欢迎star