图书管理案例

核⼼考点

: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);
        }
    }
}
相关推荐
霸道流氓气质3 分钟前
SpringBoot中基于 AES-GCM + KMS 密钥管理的数据加解密 Starter 实践
java·数据库·spring boot
Gofarlic_OMS15 分钟前
NX浮动许可调度黑名单机制,对比两款谁更合理
java·大数据·运维·开源·制造
万岳科技系统开发21 分钟前
智慧医院小程序开发推动医疗服务流程全面线上化
大数据·开发语言·人工智能
一只小灿灿23 分钟前
C++ 修饰符全面详解
开发语言·c++
马里马里奥-25 分钟前
从零搭建AI Agent工具链的技术文章大纲
开发语言·qt
乐观的Terry37 分钟前
8、发布系统-完整流水线的核心
java·spring boot·spring·spring cloud
Alexalbb38 分钟前
从角色过滤到可审计授权:单体系统数据权限设计复盘与演进
java
万亿少女的梦1681 小时前
基于Spring Boot的游戏交易管理系统设计与实现
java·spring boot·mysql·系统设计·交易管理
不做Java程序猿好多年1 小时前
Java中 String、StringBuffer、StringBuilder 的区别详解
开发语言·python
会周易的程序员1 小时前
js-shm: 高性能 Node.js 共享内存模块
开发语言·javascript·c++·node.js·共享内存·shm