回顾:自定义排序
本课属于 Coddy Java 学习旅程的“面向对象编程”单元。第 46 课,共 87 课。
挑战
简单让我们构建一个图书收藏管理器,综合运用你学过的特殊方法和排序知识。你将创建一个 Book 类,正确实现 toString()、equals()、hashCode(),并通过 Comparable 实现自然排序,还要创建外部比较器,以便灵活选择排序方式。
你将把代码分成 4 个文件:
Book.java:创建一个表示图书的类,包含 3 个私有字段:title(String)、author(String)和year(int)。为所有字段添加构造函数和 getter 方法。你的 Book 应实现
Comparable<Book>,按year自然排序,采用升序(从最早的年份开始)。重写
toString(),使其返回:[title] by [author] ([year])重写
equals(),使两本书在title和author相同时判定为相等。使用相同字段调用Objects.hash(),重写hashCode()。TitleComparator.java:创建一个比较器,按书名的字母顺序升序排序(从 A 到 Z)。AuthorComparator.java:创建一个比较器,按作者姓名的字母顺序升序排序(从 A 到 Z)。Main.java:把所有内容组合起来!你会收到 3 本书的输入,每本书占一行,格式为:title,author,year创建一个存放图书的
ArrayList,并演示以下 3 种排序方式:- 按自然顺序(按年份)排序,并打印每本书
- 打印一个空行
- 使用
TitleComparator按书名排序,并打印每本书 - 打印一个空行
- 使用
AuthorComparator按作者排序,并打印每本书
你会收到 3 行输入,每行包含一本书的数据,格式为:title,author,year
例如:1984,George Orwell,1949
记得在 Book.java 中导入 java.util.Objects,在比较器文件中导入 java.util.Comparator,并在 Main.java 中导入 java.util.ArrayList、java.util.Collections 和 java.util.Scanner。
亲手试试
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 从输入中读取三本书的信息
String line1 = scanner.nextLine();
String line2 = scanner.nextLine();
String line3 = scanner.nextLine();
// TODO:解析每一行,提取书名、作者和年份
// 提示:使用 split(",") 分隔各个值
// TODO:用解析后的数据创建 Book 对象
// TODO:创建一个 ArrayList,添加这三本书
// TODO:按自然顺序(年份)排序,并输出每本书
// TODO:输出一个空行
// TODO:使用 TitleComparator 按书名排序,并输出每本书
// TODO:输出一个空行
// TODO:使用 AuthorComparator 按作者排序,并输出每本书
}
}面向对象编程中的所有课
7特殊方法与 Object 类
toString() 方法equals() 和 hashCode()clone() 方法compareTo() 和 ComparableComparator 接口回顾:自定义排序自己练习: Java 在线编译器