从我见过的所有排序方法示例中,我从未遇到过传递比较器定义的示例。如果比较器设计为返回负值、正值或 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
提交
取消