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

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

        }

    }

}


繁花不似锦
浏览 93回答 2
2回答

Qyouu

您可以将 Comparator 的实例传递到排序方法中,以便您可以按除默认/自然的对象排序方式之外的不同方面进行排序。例如,如果有一个 Book 对象,自然排序可能基于标题。但是如果您想根据杜威十进制数进行排序怎么办?还是根据作者的名字?或者页数?您可以通过编写一个比较器来比较 Book 对象的这些字段来实现这一点。实际的排序算法不需要知道正在排序的对象。它只需要一个一致的比较器(即比较 A < B 和 B < C,然后 A < C 和 C > B 和 B > A,等等)

PIPIONE

如果比较器设计为返回负值、正值或 0 来对对象进行排序,那么排序方法会如何处理这些信息?sort 方法如何从 Comparator 定义中获取有意义的信息并执行其操作?基于比较器的排序方法(例如合并排序或冒泡排序)需要重复查看集合中的两个元素并决定哪个元素应该“排在第一位”。该决定由比较器做出,比较器返回“较小”、“较大”或“相同大小”。这些信息就足够了,排序方法不需要了解正在排序的对象类型。它可以重新排列集合中元素的顺序,直到“左侧”的所有元素都“小于”“右侧”的元素。这种方法不适用于像“桶排序”这样的东西,它需要为每个元素本身分配绝对数值(而不仅仅是与另一个元素相比的相对值)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java