1. 程式人生 > >類的可比較性Comparable和比較器Comparator

類的可比較性Comparable和比較器Comparator

string fault nts font nal 返回值 extends 方式 ret

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