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
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
在 vocus 與你一起探索內容、發掘靈感的路上,我們又將啟動新的冒險——vocus App 正式推出! 現在起,你可以在 iOS App Store 下載全新上架的 vocus App。 無論是在通勤路上、日常空檔,或一天結束後的放鬆時刻,都能自在沈浸在內容宇宙中。
Thumbnail
在 vocus 與你一起探索內容、發掘靈感的路上,我們又將啟動新的冒險——vocus App 正式推出! 現在起,你可以在 iOS App Store 下載全新上架的 vocus App。 無論是在通勤路上、日常空檔,或一天結束後的放鬆時刻,都能自在沈浸在內容宇宙中。
Thumbnail
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
Thumbnail
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, 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