Java 使用类以两种不同的方式按字母顺序排序

Java 使用类以两种不同的方式按字母顺序排序,java,Java,我有一个程序,在这个程序中,我获取了一系列书籍,让用户可以选择按作者或标题的字母顺序进行排序。我有一个Book类,其中包含Author和Title变量,以及setter和getter 我试着用非常相似的问题查看其他线程,但修复仍然会给我错误。我最近尝试的一个是使用Collections.sort(books,Comparator.comparating(Book:getTitle))。这给了我一个相互矛盾的论点的错误。我也尝试过在我的Book类中添加一个自定义的compareTo方法,但我似乎找

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

我试着用非常相似的问题查看其他线程,但修复仍然会给我错误。我最近尝试的一个是使用Collections.sort(books,Comparator.comparating(Book:getTitle))。这给了我一个相互矛盾的论点的错误。我也尝试过在我的Book类中添加一个自定义的compareTo方法,但我似乎找不到一种方法来同时对作者和标题使用它


最好的方法是什么?

您也可以在book对象本身中使用Comparator接口。这可能如下所示。它首先按作者排序,然后按标题排序。从JavaDocs中,compareTo int结果需要遵循规范:
返回:负整数、零或正整数,因为此对象小于、等于或大于指定对象。

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());
    }
}

如果您有一个名为“books”的Book对象列表,那么使用streams可以更轻松、更灵活地实现您的目标:

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

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

如果您需要提示代码中的错误,最好在此处包含一些代码示例。在这个话题上,我们能给你的建议太多了。我刚刚重新阅读了我的帖子,意识到我说的是“书籍列表”,而实际上是一系列书籍。我更新了答案
Arrays.stream(…)
将完成这项工作。或者,如果您更喜欢使用比较器,我还使用
Arrays.sort()
添加了数组比较器版本。
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););
}