Comparable接口和Comparator接口

Comparable和Comparator接口簡介

Comparable接口和Comparator接口的做用 : 用於給實現類規範比較(排序)的方法.java

首先看兩個接口的代碼:ide

Comparable接口函數

public interface Comparable<T> {
    public int compareTo(T o);
}

Comparator接口this

@FunctionalInterface
public interface Comparator<T> {
    int compare(T o1, T o2);
    //其餘默認方法和靜態方法;
    //......
}

比較兩個接口的代碼,咱們能夠看到:spa

  1.Comparable的compareTo(T)方法只有1個參數,.code

  2.Comparator接口的compare(T o1, T o2)方法有兩個參數, 有@FunctionalInterface接口,因此有Lambda表達式的用法對象

因此,blog

  Comparable只能在類內部實現比較功能,讓想讓實現比較功能的類自身實現Comparable接口排序

  Comparator能夠作成比較器類,讓比較器類實現Comparator接口繼承

Comparator接口爲何有多個抽象方法還被標註爲函數式接口?

  compare(T o1, T o2)方法外的另外一個抽象方法equals(Object obj)是Object類的方法,所以全部類都有該方法,不影響Comparator做爲函數式接口(瞎猜的).

  *接口並不是繼承自Object,只是接口定義了一套與Object徹底相同的方法(詳細內容能夠網上查詢一下,這裏暫不討論)

如何讓類實現比較功能?

讓該類實現Comparable接口,並重寫接口內的compareTo(T o)方法,示例以下

public Person implaments Comparable{
    private int id;
    private String name;
    //......構造函數及get/set方法省略
    
    @Override
    public int compareTo(Person p) {
        int result = this.id-p.getId();
        if(result<0) return -1;
        if(result > 0) return 1;
        return 0;
    }
}

  這樣,該Person類就具有了比較的功能,當要給ArrayList<Person> list排序的時候,就能夠調用Collections.sort(List T)方法,來實現對集合list的排序.

若是類沒有實現比較功能,怎麼給裝有該類的List集合排序?

  答案是: 使用比較器(Comparator)

有兩種使用方法: 

一.調用Collections.sort(List T, Comparator<? super T> c)重載方法,傳入list和比較器對象實現排序

Collections.sort(list1, new Comparator<String>() {
	@Override
	public int compare(String o1, String o2) {
		int a = Integer.parseInt(o1);
		int b = Integer.parseInt(o2);
		if (a>b) return 1;
		if (a<b) return -1;
		return 0;
	}
});

  

二.使用List的sort(Comparator<? super T> c)方法,傳入比較器對象來排序

list1.sort(new Comparator<String>() {
    @Override
    public int compare(String o1, String o2) {
        int a = Integer.parseInt(o1);
        int b = Integer.parseInt(o2);
        if (a>b) return 1;
        if (a<b) return -1;
        return 0;
    }
)

  由於Comparator接口是函數式接口,因此List的sort()方法和Collections的sort()方法,均可以用Lambda表達式的寫法.

  

Collections.sort(list1, (a,b) -> {
  //......省略
  return 0;
});
list1.sort((a, b) -> {
  //......省略
  return 0;
});

  

fff

相關文章
相關標籤/搜索