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

时间:2019-10-12 23:41:13

标签: java sorting arraylist compareto

从我所见过的所有排序方法示例中,我从未遇到过传递比较器定义的示例。 如果比较器被设计为返回负数,正数或0来对对象进行排序,那么排序方法对该信息有何作用? 排序方法如何从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;
        }
    }
}

这是整个Comparator类:

{{1}}

2 个答案:

答案 0 :(得分:5)

您可以将Comparator的实例传递给sort方法,以便您可以对对象进行默认/自然方式之外的其他方面的排序。

例如,如果具有Book对象,则自然排序可能基于标题。但是,如果您想根据杜威十进制数排序怎么办?还是基于作者的名字?还是页数?您可以通过编写比较器来比较Book对象的那些字段来做到这一点。

实际的排序算法不需要知道要排序的对象。它只需要一个比较器是一致的(即A B和B> A等的比较)

答案 1 :(得分:2)

  

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

基于比较器的排序方法(例如合并排序或冒泡排序)需要反复查看集合中的两个元素,并确定哪个元素应该“优先”。比较器将做出此决定,比较器将返回“较小”,“较大”或“相同大小”。

此信息已足够,排序方法不需要了解要排序的对象类型。它可以重新排列集合中元素的顺序,直到“左边”的所有元素都比“右边”的元素“小”。

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