首页 > 解决方案 > 使用类以 2 种不同的方式按字母顺序排序

问题描述

我有一个程序,我在其中获取了一系列书籍,并让用户可以选择按作者或标题的字母顺序排序。我有一个 Book 类,其中包含 Author 和 Title 变量,以及 setter 和 getter。

我曾尝试查看具有非常相似问题的其他线程,但修复仍然给我错误。我最近尝试的一个是使用 Collections.sort(books, Comparator.comparing(Book:getTitle))。这给了我一个错误的论点。我也尝试在我的 Book 类中添加一个自定义 compareTo 方法,但我似乎找不到将其用于 Author 和 Title 的方法。

解决此问题的最佳方法是什么?

标签: java

解决方案


您还可以在 book 对象本身中使用 Comparator 接口。这可能如下所示。它首先按作者排序,然后按标题排序。从 JavaDocs compareTo int 结果需要遵循规范: Returns: a negative integer, zero, or a positive integer as this object is less than, equal to, or greater than the specified object.

public class Book implements Comparable{
    private String author;
    private String title;

    public Book(String author, String title){
        this.author = author;
        this.title = title;
    }

    public String getAuthor() {
        return author;
    }

    public String getTitle() {
        return title;
    }


    @Override
    public int compareTo(Object o) {
        Book other = (Book) o;

        //Your compare code goes here
        int result = this.author.compareTo(other.author);
        if(result ==0){
            result = this.title.compareTo(other.title);
        }
        return ;
    }
}

当您想使用不同的排序时,您可以使用 Comparator 对象:

public class AuthorComparator implements Comparator<Book>{

    @Override
    public int compare(Book a, Book b) {
        return a.getAuthor().compareTo(b.getAuthor());
    }
}

public class TitleComparator implements Comparator<Book>{

    @Override
    public int compare(Book a, Book b) {
        return a.getTitle().compareTo(b.getTitle());
    }
}

使用 Comparator 类对书籍数组进行排序:

book[] books = getBooksFromSomewhere();
Arrays.sort(books, new TitleComparator());

//now resort by Author
Arrays.sort(books, new AuthorComparator());

如果您有一个名为“books”的 Book Object 列表,则可以使用更简单、更灵活的方法来实现您想要的内容:

private void printBooksByTitle(List<Book> unsortedBooks)
        List<Book> titleSortedBooks = unsortedBooks.stream()
            .sorted(Comparator.comparing(Book::getTitle))
            .collect(Collectors.toList());

        titleSortedBooks.forEach(System.out::println);
}

书籍数组的版本(针对更新的问题):

private Book[] sortBooksByTitle(Book[] books){
    Book[] titleSortedBooks = Arrays.stream(books)
            .sorted(Comparator.comparing(Book::getTitle))
            .collect(Collectors.toArray(Book[]::new););
}

推荐阅读