1. 程式人生 > 實用技巧 >Java學習 - Comparable介面,Comparator介面與sort函式

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 a ClassCastException for any elements e1 and e2 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 a ClassCastException for any elements e1 and e2 in the list).

If the specified comparator is null then all elements in this list must implement the Comparable interface and the elements' natural ordering should be used.

This list must be modifiable, but need not be resizable.

同時還給出了引數c的介紹

Parameters:

c - the Comparator used to compare list elements. A null 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()));