【问题标题】:Why can i pass a comparator object to the sort method?为什么我可以将比较器对象传递给排序方法?
【发布时间】:2020-02-10 01:24:33
【问题描述】:

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

【问题讨论】:

  • 所有种类,所有语言,都需要某种比较器。 Java 的默认比较器是使用所谓的“自然排序”,即 Comparable 实例的比较器。对于非 Comparables(或覆盖默认值),您提供要使用的比较器(而不是)
  • 你能解释一下你的精确问题是什么吗?因为实际上,您的问题的答案基本上是“排序算法使用比较器进行比较”。但我不确定这个答案是否会让你满意。

标签: java sorting arraylist compareto


【解决方案1】:

您可以将 Comparator 的实例传递给排序方法,这样您就可以在默认/自然排序对象之外的不同方面进行排序。

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-10-23
      • 1970-01-01
      • 2011-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多