Comparator vs Comparable

更新於 發佈於 閱讀時間約 8 分鐘

使用Comparator

class Student{
int id;
String name;

public Student(int id, String name) {
this.id = id;
this.name = name;
}

@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}

public class Demo {
public static void main(String[] args) {

List<Student> studentList = new ArrayList<>();

studentList.add(new Student(2, "Chris"));
studentList.add(new Student(1, "Genos"));
studentList.add(new Student(4, "Mike"));
studentList.add(new Student(3, "Jack"));

System.out.println(studentList);
// [Student{id=2, name='Chris'}, Student{id=1, name='Genos'}, Student{id=4, name='Mike'}, Student{id=3, name='Jack'}]

Comparator<Student> comparator = new Comparator<>(){

@Override
public int compare(Student s1, Student s2) {
if(s1.id > s2.id) return 1;
else if(s1.id < s2.id) return -1;
return 0;
}
};

Collections.sort(studentList, comparator);

System.out.println(studentList);
// [Student{id=1, name='Genos'}, Student{id=2, name='Chris'}, Student{id=3, name='Jack'}, Student{id=4, name='Mike'}]
}
}

排序前,將list印出來看的話,會按照我們所add進list的順序而顯示 (第29行)

按照自行定義的Comparator進行排序 (第32~42行)

排序之後,印出來的結果將會按照我們定義的Comparator的compare方法而排序,我要求以id由小到大排序


使用Comparable

class Student implements Comparable<Student> {
int id;
String name;

public Student(int id, String name) {
this.id = id;
this.name = name;
}

@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}

@Override
public int compareTo(Student otherStudent) {
if(this.id > otherStudent.id) return 1;
else if(this.id < otherStudent.id) return -1;
return 0;
}
}

public class Demo {
public static void main(String[] args) {

List<Student> studentList = new ArrayList<>();

studentList.add(new Student(2, "Chris"));
studentList.add(new Student(1, "Genos"));
studentList.add(new Student(4, "Mike"));
studentList.add(new Student(3, "Jack"));

System.out.println(studentList);
// [Student{id=2, name='Chris'}, Student{id=1, name='Genos'}, Student{id=4, name='Mike'}, Student{id=3, name='Jack'}]

Collections.sort(studentList);

System.out.println(studentList);
// [Student{id=1, name='Genos'}, Student{id=2, name='Chris'}, Student{id=3, name='Jack'}, Student{id=4, name='Mike'}]
}
}

與上一個方法的差別在於

Student class implements了Comparable,並且重寫了compareTo方法

注意implements Comparable<Student> 有指定Student型態

compareTo方法的內容和前一個方法的compare方法一樣

只是compareTo方法的參數只會傳入一個,也就是Student型態的物件

也就是要被比較的Student物件


因此第39行的Collections.sort(studentList); 部分,就不需要特地指定要使用哪一個Comparator作排序規則參考

因為我們的Student class裡面已經先定義好該如何比較了


留言
avatar-img
留言分享你的想法!
avatar-img
Genos's Coding Diary的沙龍
6會員
19內容數
我的Java學習日記
2023/10/03
為何要重寫equals方法? 為何要重寫hashCode方法?
2023/10/03
為何要重寫equals方法? 為何要重寫hashCode方法?
2023/09/27
併發,多個事情在同一時間段內同時發生 並行,多個事情在同一個時間點上同時發生
2023/09/27
併發,多個事情在同一時間段內同時發生 並行,多個事情在同一個時間點上同時發生
2023/09/26
Map是由Key-Value所組成的 而Key的部分不能重複,因為是Set
2023/09/26
Map是由Key-Value所組成的 而Key的部分不能重複,因為是Set
看更多
你可能也想看
Thumbnail
常常被朋友問「哪裡買的?」嗎?透過蝦皮分潤計畫,把日常購物的分享多加一個步驟,就能轉換成現金回饋。門檻低、申請簡單,特別適合學生與上班族,讓零碎時間也能創造小確幸。
Thumbnail
常常被朋友問「哪裡買的?」嗎?透過蝦皮分潤計畫,把日常購物的分享多加一個步驟,就能轉換成現金回饋。門檻低、申請簡單,特別適合學生與上班族,讓零碎時間也能創造小確幸。
Thumbnail
嗨!歡迎來到 vocus vocus 方格子是台灣最大的內容創作與知識變現平台,並且計畫持續拓展東南亞等等國際市場。我們致力於打造讓創作者能夠自由發表、累積影響力並獲得實質收益的創作生態圈!「創作至上」是我們的核心價值,我們致力於透過平台功能與服務,賦予創作者更多的可能。 vocus 平台匯聚了
Thumbnail
嗨!歡迎來到 vocus vocus 方格子是台灣最大的內容創作與知識變現平台,並且計畫持續拓展東南亞等等國際市場。我們致力於打造讓創作者能夠自由發表、累積影響力並獲得實質收益的創作生態圈!「創作至上」是我們的核心價值,我們致力於透過平台功能與服務,賦予創作者更多的可能。 vocus 平台匯聚了
Thumbnail
在進行SQL查詢邏輯更改時,需要適當地使用SubQuery和join來達到新的排序需求。本文將介紹原本的撈取邏輯、需求以及如何使用SubQuery來解決新的排序需求。
Thumbnail
在進行SQL查詢邏輯更改時,需要適當地使用SubQuery和join來達到新的排序需求。本文將介紹原本的撈取邏輯、需求以及如何使用SubQuery來解決新的排序需求。
Thumbnail
很明顯可以看到 parallelSort(T[], Comparator<T> 大概可以帶來 2.5 倍到接近 3 倍的效能增益 (和數量無關)。所以,結論是當需要處理大量資料的排序時,真的可以考慮使用 parallelSort(T[], Comparator<T>。
Thumbnail
很明顯可以看到 parallelSort(T[], Comparator<T> 大概可以帶來 2.5 倍到接近 3 倍的效能增益 (和數量無關)。所以,結論是當需要處理大量資料的排序時,真的可以考慮使用 parallelSort(T[], Comparator<T>。
Thumbnail
本文探討了監督式學習、分群和相似度這幾個推薦系統算法,分別討論了它們的優點、缺點以及適用場景。這些算法在推薦系統中扮演著重要角色,並透過特徵選擇與預處理、相似度度量和鄰居的選擇等關鍵因素進行深入分析。文章最後提出在選擇推薦系統算法時應該考慮的因素,以及未來的研究方向。
Thumbnail
本文探討了監督式學習、分群和相似度這幾個推薦系統算法,分別討論了它們的優點、缺點以及適用場景。這些算法在推薦系統中扮演著重要角色,並透過特徵選擇與預處理、相似度度量和鄰居的選擇等關鍵因素進行深入分析。文章最後提出在選擇推薦系統算法時應該考慮的因素,以及未來的研究方向。
Thumbnail
高中數學主題練習—求等比數列某項與等差級數
Thumbnail
高中數學主題練習—求等比數列某項與等差級數
Thumbnail
高中數學主題練習—求等差數列某項與等差級數
Thumbnail
高中數學主題練習—求等差數列某項與等差級數
Thumbnail
題目敘述 題目會給我們兩張資料表。 第一張資料表是Employees 裡面分別有id、name等欄位。這張資料表的id是主鍵。 第二張資料表是EmployeeUNI 裡面分別有id、unique_id等欄位。 題目要求我們列出每位員工對應到的Unique ID
Thumbnail
題目敘述 題目會給我們兩張資料表。 第一張資料表是Employees 裡面分別有id、name等欄位。這張資料表的id是主鍵。 第二張資料表是EmployeeUNI 裡面分別有id、unique_id等欄位。 題目要求我們列出每位員工對應到的Unique ID
Thumbnail
聚合函數 可以對資料的筆數、平均、最大、最小和加總的運算,提供查詢結果:如下表示: COUNT(Column):計算筆數,「*」是統計紀錄數。 AVG(Column):計算欄位平均值。 MAX(Column):計算欄位最大值。 MIN(Column):計算欄位最小值。 SUM(Colum
Thumbnail
聚合函數 可以對資料的筆數、平均、最大、最小和加總的運算,提供查詢結果:如下表示: COUNT(Column):計算筆數,「*」是統計紀錄數。 AVG(Column):計算欄位平均值。 MAX(Column):計算欄位最大值。 MIN(Column):計算欄位最小值。 SUM(Colum
Thumbnail
多條件查詢 AND運算子 SELECT *​ FROM your_table_name WHERE column1 LIKE '_value1%' AND column2 = number​2 OR運算子 SELECT *​ FROM your_table_name WHERE colu
Thumbnail
多條件查詢 AND運算子 SELECT *​ FROM your_table_name WHERE column1 LIKE '_value1%' AND column2 = number​2 OR運算子 SELECT *​ FROM your_table_name WHERE colu
Thumbnail
查詢範圍 指定欄位 SELECT column1, column2, column3,... FROM your_table_name 不重複欄位 SELECT DISTINCT column1 FROM your_table_name 欄位別名 SELECT column1 A
Thumbnail
查詢範圍 指定欄位 SELECT column1, column2, column3,... FROM your_table_name 不重複欄位 SELECT DISTINCT column1 FROM your_table_name 欄位別名 SELECT column1 A
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News