图书管理案例

核⼼考点

:TreeSet 定制排序、重写 equals/hashCode、Set 唯⼀校验、对象⾃然排序 题⽬要求:

  1. 封装 Book 类:ISBN(唯⼀)、书名、作者、价格;

  2. ISBN 相同则视为同⼀ 本书,Set ⾃动去重;

  3. 使⽤ TreeSet 存储,排序规则:价格升序 → 书名字典序;

  4. 验证重复 ISBN 的图书⽆法添加;

  5. 输出所有图书。

打印结果:

=====图书列表(去重+排序)=====

Book{ISBN='97803', 书名='Spring实战', 价格=89.0}

Book{ISBN='97802', 书名='深⼊理解JVM', 价格=89.0}

Book{ISBN='97801', 书名='Java编程思想', 价格=108.0}

. 封装 Book 类

  • 创建 Book 类,包含 4 个成员变量:
    • isbn(唯一标识)
    • 书名
    • 作者
    • 价格
  • 生成无参 / 有参构造、getter/setter、toString

2. 实现去重规则:ISBN 相同视为同一本书

TreeSet / HashSet 去重都依赖两个方法:

  1. equals()
  2. hashCode()

必须重写这两个方法:

  • 比较规则:只比较 isbn
  • 如果 isbn 相同 → 返回 true,视为同一个对象 → Set 自动去重

3. TreeSet 定制排序规则

题目要求排序规则: 价格升序 → 价格相同则按书名字典序升序

实现方式:

  • Book实现 Comparable<Book> 接口
  • 重写 compareTo(Book o) 方法

排序逻辑:

  1. 先比较价格:价格小 → 排在前面
  2. 如果价格相同 ,再比较书名(字典序)

4. TreeSet 去重的关键规则(必考点)

TreeSet 不使用 equals/hashCode 去重 ! TreeSet 完全依靠 compareTo 方法的返回值判断是否重复

  • 返回 0 → 视为重复元素,不添加
  • 返回非 0 → 视为不同元素

所以: 必须让 compareTo 在 isbn 相同时返回 0 才能保证 ISBN 重复的书无法添加。

最终 compareTo 逻辑:

  1. 先判断:如果当前书 isbn 与比较书 isbn 相同 → 直接 return 0(强制去重)
  2. 否则按照:价格升序 → 书名字典序 排序

5. 测试类逻辑

  1. 创建 TreeSet<Book> 集合
  2. 添加多本图书(包含 ISBN 重复的书)
  3. 遍历集合输出
  4. 验证:ISBN 重复的书不会被添加
  5. 输出结果按:价格升序 → 书名排序

核心考点总结(纯文字背会就能写对)

  1. Book 类:4 个属性 + toString
  2. 去重:重写 equals + hashCode,只比较 ISBN
  3. 排序:Book 实现 Comparable,重写 compareTo
  4. TreeSet 去重关键:ISBN 相同 → compareTo 返回 0
  5. 排序规则:价格升序 → 书名字典序
  6. 验证:重复 ISBN 无法添加,输出有序且无重复
复制代码
package com.sy.Task;

import java.util.Objects;
import java.util.TreeSet;

public class Book3 implements Comparable<Book3> {
    private String isbn;
    private String name;
    private String author;
    private double price;

    public Book3() {
    }

    public Book3(String isbn, String name, String author, double price) {
        this.isbn = isbn;
        this.name = name;
        this.author = author;
        this.price = price;
    }

    public String getIsbn() {
        return isbn;
    }

    public void setIsbn(String isbn) {
        this.isbn = isbn;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    @Override
    public String toString() {
        return "Book3{" +
                "isbn='" + isbn + '\'' +
                ", name='" + name + '\'' +
                ", author='" + author + '\'' +
                ", price=" + price +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Book3 book3 = (Book3) o;
        return Double.compare(price, book3.price) == 0 && Objects.equals(isbn, book3.isbn) && Objects.equals(name, book3.name) && Objects.equals(author, book3.author);
    }

    @Override
    public int hashCode() {
        return Objects.hash(isbn, name, author, price);
    }

    @Override
    public int compareTo(Book3 o) {
        return 0;
    }
}

class BookTest {
    public static void main(String[] args) {
        TreeSet<Book3> bookSet = new TreeSet<>();
        bookSet.add(new Book3("97803", "Spring实战", "作者A", 89.0));
        bookSet.add(new Book3("97802", "深入理解JVM", "作者B", 89.0));
        bookSet.add(new Book3("97801", "Java编程思想", "作者C", 108.0));
        bookSet.add(new Book3("97803", "重复的书", "作者D", 99.0));
        for (Book3 book : bookSet) {
            System.out.println(book);
        }
    }
}
相关推荐
basketball6161 小时前
C++ iostream 完全指南:从 cin/cout 到流式编程的奥秘
开发语言·c++
日月云棠1 小时前
JAVA数据结构与算法 - 基础:常用集合简述
java·算法
噢,我明白了1 小时前
MyBatis-Plus的引入和配置
java·tomcat·mybatis
SilentSamsara1 小时前
运算符重载:让自定义对象支持 +、[]、in 操作
开发语言·python·算法·青少年编程·pycharm
threelab1 小时前
Three.js 3D 热力图效果 | 三维可视化 / AI 提示词
开发语言·前端·javascript·人工智能·3d·着色器
日月云棠1 小时前
JAVA数据结构与算法 - 基础:BlockingQueue
java·算法
哪吒编程1 小时前
GPT 5.5 Thinking深度思考了十几分钟,给我挖了一个排查一周的并发大坑
java
likerhood1 小时前
设计模式 · 享元模式(Flyweight Pattern)java
java·设计模式·享元模式
我的世界洛天依1 小时前
胡桃讲编程 | 外挂的另一种方法与防御 —— 对象(JS ES262)
开发语言·javascript·ecmascript