Menu
CoddyTech

回顾:自定义排序

本课属于 Coddy Java 学习旅程的“面向对象编程”单元。第 46 课,共 87 课。

challenge icon

挑战

简单

让我们构建一个图书收藏管理器,综合运用你学过的特殊方法和排序知识。你将创建一个 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 种排序方式:

    1. 按自然顺序(按年份)排序,并打印每本书
    2. 打印一个空行
    3. 使用 TitleComparator 按书名排序,并打印每本书
    4. 打印一个空行
    5. 使用 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 按作者排序,并输出每本书
    }
}

面向对象编程中的所有课

自己练习: Java 在线编译器