为了账号安全,请及时绑定邮箱和手机立即绑定

为什么我可以将比较器对象传递给排序方法?

为什么我可以将比较器对象传递给排序方法?

繁花不似锦 2023-10-19 21:50:51
从我见过的所有排序方法示例中,我从未遇到过传递比较器定义的示例。如果比较器设计为返回负值、正值或 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,等等)


查看完整回答
反对 回复 2023-10-19
?
PIPIONE

TA贡献1829条经验 获得超9个赞

如果比较器设计为返回负值、正值或 0 来对对象进行排序,那么排序方法会如何处理这些信息?sort 方法如何从 Comparator 定义中获取有意义的信息并执行其操作?

基于比较器的排序方法(例如合并排序或冒泡排序)需要重复查看集合中的两个元素并决定哪个元素应该“排在第一位”。该决定由比较器做出,比较器返回“较小”、“较大”或“相同大小”。

这些信息就足够了,排序方法不需要了解正在排序的对象类型。它可以重新排列集合中元素的顺序,直到“左侧”的所有元素都“小于”“右侧”的元素。

这种方法不适用于像“桶排序”这样的东西,它需要为每个元素本身分配绝对数值(而不仅仅是与另一个元素相比的相对值)。


查看完整回答
反对 回复 2023-10-19
  • 2 回答
  • 0 关注
  • 92 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信