Java學習 - Comparable介面,Comparator介面與sort函式
Java 的 Comparable 介面 和 Comparator 介面
寫這一篇部落格,主要是為了學習Java的元素排序。為了進行元素排序,首先需要定義排序方式。Java的Comparable介面就類似C++中的過載<=,而Java的Comparator介面就類似C++中為sort而定義的comp函式。
介面名稱 | 包 | 主要函式 |
---|---|---|
Comparable | java.lang | int compareTo(T o)(比較此物件與指定物件的順序) |
Comparator | java.util | int compare(T o1,T o2)(比較用來排序的兩個引數) ,boolean equals(Object obj)(指示某個其他物件是否“等於”此Comparator) |
一、Comparable 介面
介面定義
Interface Comparable<T> // 'T' - the type of objects that this object may be compared to
介面抽象方法:
int compareTo(T o); // Parameters: // o - the object to be compared. // Returns: // a negative integer, zero, or a positive integer as this object is less than, equal to, or greater than // the specified object.
在一個類中定義Comparable介面,實際上是定義了這個類的自然順序(natural ordering)。對一個定義了自然順序的類進行排序,如果不再指定別的排序方式,那麼預設按照自然順序從小到大進行排序。
定義自然順序的方法如下:
例如我們想要將Person類按照年齡從小到大排序
首先,讓Person繼承Comparable介面,使之具有“可比”的功能
class Person implements Comparable<Person>
然後,在類內部實現介面的compareTo方法
@Override public int compareTo(Person arg0) { return this.age - arg0.age; }
完整程式碼
class Person implements Comparable<Person>{
private String name;
private int age;
public Person() {};
public Person(String name,int age) {
this.name = name;
this.age = age;
}
public int getAge(){
return age;
}
@Override
public int compareTo(Person arg0) {
return this.age - arg0.age;
}
}
例如我們已經將若干個Person儲存到Collectoins中,對其排序
ArrayList<Person> arrlist = new ArrayList<Person>();
// add data
Collections.sort(arrlist);
// or
arrlist.sort(null);
- 前者的排序方法:
呼叫Collections工具類中的靜態方法sort
靜態方法的定義
public static <T extends Comparable<? super T>> void sort(List<T> list)
功能介紹
Sorts the specified list into ascending order, according to the natural ordering of its elements. All elements in the list must implement the
Comparable
interface. Furthermore, all elements in the list must be mutually comparable (that is,e1.compareTo(e2)
must not throw aClassCastException
for any elementse1
ande2
in the list).
- 後者的排序方法:
呼叫ArrayList類的成員方法sort,這個sort實際上是ArrayList類實現介面List中定義的抽象方法 sort()
成員方法定義
default void sort(Comparator<? super E> c)
功能介紹
Sorts this list according to the order induced by the specified
Comparator
.All elements in this list must be mutually comparable using the specified comparator (that is,
c.compare(e1, e2)
must not throw aClassCastException
for any elementse1
ande2
in the list).If the specified comparator is
null
then all elements in this list must implement theComparable
interface and the elements' natural ordering should be used.This list must be modifiable, but need not be resizable.
同時還給出了引數c的介紹
Parameters:
c
- theComparator
used to compare list elements. Anull
value indicates that the elements' natural ordering should be used
二、Comparator 介面
使用Comparator介面的方法
- step1: 新建一個類,繼承自Comparator介面,在內部實現compare函式
class PersonComparator implements Comparator<Person>{
@Override
public int compare(Person a,Person b){
return a.getAge() - b.getAge();
}
}
- step2: 用Collections.sort()或List.sort()進行排序
ArrayList<Person> arrlist = new ArrayList<Person>();
// add data
Collections.sort(arrlist,new PersonComparator());
// or
arrlist.sort(new PersonComparator());
使用lambda表示式實現Comparator介面
lambda表示式是一種語法糖,由於Comparator往往語法簡單,程式碼邏輯較少,因此十分適合使用lambda表示式簡化。
arrlist.sort((o1,o2)->(o1.getAge()-o2.getAge()));