java - 使用类以 2 种不同的方式按字母顺序排序
问题描述
我有一个程序,我在其中获取了一系列书籍,并让用户可以选择按作者或标题的字母顺序排序。我有一个 Book 类,其中包含 Author 和 Title 变量,以及 setter 和 getter。
我曾尝试查看具有非常相似问题的其他线程,但修复仍然给我错误。我最近尝试的一个是使用 Collections.sort(books, Comparator.comparing(Book:getTitle))。这给了我一个错误的论点。我也尝试在我的 Book 类中添加一个自定义 compareTo 方法,但我似乎找不到将其用于 Author 和 Title 的方法。
解决此问题的最佳方法是什么?
解决方案
您还可以在 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););
}
推荐阅读
- powershell - PowerShell:测试路径 -IsValid 不起作用
- javascript - ReactJS - 在包含在子组件中的 div 中未观察到状态变化
- python - 关于在pytorch中使用RNN
- json - 将 json 数据分配给标签
- python - 如何使用 dask 和 xarray 加载和处理 zarr 文件
- c++ - “类”尚未声明
- html - 取消选中时隐藏选中的复选框
- control-m - YYYYMM 的 controlM 变量?
- c# - Unity - 用鼠标围绕对象旋转
- python-3.x - 在 Windows10 上为 Firefox 使用 selenium/geckodriver “无法找到一组匹配的功能”