從我見過的所有排序方法示例中,我從未遇到過傳遞比較器定義的示例。如果比較器設計為返回負值、正值或 0 來對對象進行排序,那么排序方法會如何處理這些信息?sort 方法如何從 Comparator 定義中獲取有意義的信息并執行其操作?這是有問題的排序方法: public void sort() { library.sort(new BookComparator()); }這是整個 Comparator 類:import java.util.Comparator;public class BookComparator implements Comparator<Book> { public int compare(Book a, Book b) { if(a == null || b == null) { throw new NullPointerException(); } int result = 0 ; if(a.getAuthor() == null) { if(b.getAuthor() != null) { result = -1; } } else if(b.getAuthor() == null) { result = 1; } else { result = a.getAuthor().compareTo(b.getAuthor()); } if(result !=0) { return result; } if(a.getTitle() == null) { if(b.getTitle() != null) { result = -1; } } else if(b.getTitle() == null) { result = 1; } else { result = a.getTitle().compareTo(b.getTitle()); } if(result !=0) { return result; } if(a.getYear() < b.getYear()){ return -1; } else if (a.getYear() == b.getYear()){ return 0; } else { return 1; } }}
2 回答

Qyouu
TA貢獻1786條經驗 獲得超11個贊
您可以將 Comparator 的實例傳遞到排序方法中,以便您可以按除默認/自然的對象排序方式之外的不同方面進行排序。
例如,如果有一個 Book 對象,自然排序可能基于標題。但是如果您想根據杜威十進制數進行排序怎么辦?還是根據作者的名字?或者頁數?您可以通過編寫一個比較器來比較 Book 對象的這些字段來實現這一點。
實際的排序算法不需要知道正在排序的對象。它只需要一個一致的比較器(即比較 A < B 和 B < C,然后 A < C 和 C > B 和 B > A,等等)

PIPIONE
TA貢獻1829條經驗 獲得超9個贊
如果比較器設計為返回負值、正值或 0 來對對象進行排序,那么排序方法會如何處理這些信息?sort 方法如何從 Comparator 定義中獲取有意義的信息并執行其操作?
基于比較器的排序方法(例如合并排序或冒泡排序)需要重復查看集合中的兩個元素并決定哪個元素應該“排在第一位”。該決定由比較器做出,比較器返回“較小”、“較大”或“相同大小”。
這些信息就足夠了,排序方法不需要了解正在排序的對象類型。它可以重新排列集合中元素的順序,直到“左側”的所有元素都“小于”“右側”的元素。
這種方法不適用于像“桶排序”這樣的東西,它需要為每個元素本身分配絕對數值(而不僅僅是與另一個元素相比的相對值)。
添加回答
舉報
0/150
提交
取消