類的可比較性Comparable和比較器Comparator
阿新 • • 發佈:2018-05-07
string fault nts font nal 返回值 extends 方式 ret 1.
2.
1. Comparable
Comparable
源碼如下:
public interface Comparable<T> {
public int compareTo(T o);
}
類實現該接口意味著該類是可比較的,其方法返回值-1,0,1
分別表示當前類比進行比較的類(方法參數)小、相等、大。
實現該接口意味著該類有了‘可比較’的屬性。
2. Comparator
Comparator
部分源碼如下:
@FunctionalInterface public interface Comparator<T> { int compare(T o1, T o2); ... default Comparator<T> reversed() { return Collections.reverseOrder(this); } ... public static <T extends Comparable<? super T>> Comparator<T> reverseOrder() { return Collections.reverseOrder(); } ...
如果對沒有實現Comparable
接口的類進行排序,那麽可以使用比較器Comparator
實現。他可以選出類中一些“信息”進行比較,比如變量甚至哈希碼。
如源碼所示該接口是函數式接口,其唯一抽象方法是int compare(T o1,T o2)
,其返回值-1,0,1
分別表示第一個參數比第二個參數小、相等、大。
如果對一個實現Comparator
的類指定比較器進行比較的時候,比較規則與比較器對齊。示例如下:
class DemoClass implements Comparable{ public int a; public DemoClass(int a) { this.a = a; } @Override public int compareTo(Object o) { return (a<((DemoClass)o).a)?-1:(a==((DemoClass)o).a?0:1); } @Override public String toString() { return a+""; } } public class Test2 { public static void main(String[] args) { List<DemoClass> list=new ArrayList(); list.add(new DemoClass(3)); list.add(new DemoClass(1)); list.add(new DemoClass(2)); System.out.println(list); //用元素自身比較屬性進行排序 Collections.sort(list); System.out.println(list); //用比較器進行排序 Collections.sort(list,(x,y)->{//此時x和y都是list中元素類型 return x.a<y.a?1:(x.a==y.a?0:-1);//邏輯與類定義的比較方式相反 }); System.out.println(list); } } output: [3, 1, 2] [1, 2, 3] [3, 2, 1]
類的可比較性Comparable和比較器Comparator