25 、日期类和集合类的综合应用问题

在实际项目开发中需要存储各种类型的对象数据,一般使用数组存储存在存储个数不确定问题,通常使用集合类型来存储。给你的问题是,在图书信息系统中一个出版社和图书信息,一个出版社发行多门图书,每图书属于一个出版社,在图书查询中往往需要进行某图书属于那个出版社,该出版社在发行某图书的当年发行了多少图书等相关查询,如果使用集合合理存储了出版社和图书对象,进行相关查询将变得容易。
本问题使用标准输入出版社和图书信息,然后查出某图书的出版社,以及该出版社在该图书出版当年发行图书的种类数目。
输入:

标准输入,输入的第一行为两个正整数N、M,N表示接下来的N行为出版社信息,每行由出版社编号、出版社名称、出版社地址,数据之间为一个逗号",“分隔;出版社信息后M行为图书信息,图书可能有重复,图书信息的每行依次为图书ISBN、出版社编号、图书名称、出版日期、图书价格构成,数据之间为一个逗号”,"分格。图书数据之后的所有行为图书ISBN数据,需要你完成查找的图书,每个图书查找信息使用一行输出。
输出:

标准输出,根据需要你查找图书ISBN使用一行输出该图书所在的出版社编号和该出版社该图书发行年发行的图书种类数目;如果该图书不存在,输出"No Book"。

输入样列:

6 22
81070,中国矿业大学出版社,徐州
75605,西安交通大学出版社,西安市兴庆南路10号
302,清华大学出版社,清华大学学研楼A座608室
313,上海交通大学出版社,上海市徐汇区番禺路951号
301,北京大学出版社,北京市海淀区成府路205号
5635,北京邮电大学出版社,北京市海淀区西土城路10号
9787302595021,302,土力学(第3版),2022年10月1日,75.00
9787302611509,302,人工智能安全,2022年10月1日,59.00
9787302597810,302,创业风险管理:开公司必知的128个实操陷阱,2022年7月1日,88.00
9787563547630,5635,Oracle数据库应用与实训教程,2021年7月9日,32.00
9787563542208,5635,单片机原理及接口技术实验教程,2021年7月10日,28.00
9787563537488,5635,动画分镜头设计,2022年7月18日,42.00
9787563542505,5635,Java面向对象程序设计(第4版)(含习题解答与实验),2022年7月19日,46.00
9787563542475,5635,C语言程序设计,2022年7月26日,34.00
9787563546497,5635,C语言程序设计实验指导,2022年7月27日,25.00
978-7-313-22794-2,75605,中国对日战犯审判档案集成(全102卷),2020年9月1日,61200.00
978-7-313-11811-0,75605,进化医学引论,2014年10月8日,48.00
978-7-313-10821-0,75605,平台企业管理:打造最具魅力的企业,2014年3月5日,38.00
7-313-02472-X/TB.053,75605,产品设计,2006年1月1日,25.00
7-313-036438,75605,电子技术实习教程,2004年3月21日,20.00
9787313033185,75605,网页开发技术ASP实践教程,2003年4月10日,34.50
9787313033239,75605,大学英语听力考前冲刺(六级 配音带),2003年3月20日,20.00
978-7-301-31257-5,301,1848年欧洲革命,2021年8月19日,49.00
978-7-301-32258-1,301,人工智能哲学十五讲,2021年7月1日,65.00
978-7-301-32044-0,301,一个村庄的奋斗 : 1965—2020中华民族伟大复兴的乡村基础,2021年5月31日,98.00
978-7-301-32040-2,301,批判性思维与写作,2021年4月12日,32.00
978-7-301-32044-0,301,一个村庄的奋斗 : 1965—2020中华民族伟大复兴的乡村基础,2021年5月31日,98.00
978-7-301-31257-5,301,1848年欧洲革命,2021年8月19日,49.00
9787313033185
978-7-301-31051-6
978-7-301-32258-1

输出样列:

75605 2
No Book
301 4

这一题有多种写法,下面给出两种

第一种,使用 Map ,代码简单

package yunayj.test;

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        // 输入出版社信息个数
        int n = sc.nextInt();
        // 输入图书信息个数
        int m = sc.nextInt();
        sc.nextLine();
        // count 根据 出版社编号和出版年份 来记录 出现次数
        Map<String, Integer> count = new HashMap<>();
        // bookInfo 根据 ISBN 来记录当前书籍的 出版社编号和出版年份
        Map<String, String> bookInfo = new HashMap<>();
        // 出版社的消息没有用,全部消去
        for (int i = 0; i < n; i ++) {
            String str = sc.nextLine();
        }
        // 输入图书信息
        for (int i = 0; i < m; i ++) {
            String[] s = sc.nextLine().split(",");
            // 题目有说信息可能重复录入,如果已经有该图书的信息,就要跳过,避免重复记录
            if (bookInfo.get(s[0]) != null) continue;
            // time 为时间
            String time = s[3].substring(0, 4);
            // 用 info 表示 出版社编号和出版年份
            String info = s[1] + time;
            // 以图书的 ISBN (唯一)为关键字,出版社编号和出版年份为值 存进 bookInfo
            bookInfo.put(s[0], info);
            // 根据 出版社编号和出版年份 来统计出现次数
            if (count.get(info) == null) {
                count.put(info, 1);
            } else {
                count.put(info, count.get(info) + 1);
            }
        }
        while (sc.hasNextLine()) {
            // 输入图书的 ISBN
            String str = sc.nextLine();
            // 根据图书的 ISBN 获取对应的 出版社编号和出版年份
            String info = bookInfo.get(str);
            // 如果 info == null 证明没有找到该书
            if(info == null) {
                System.out.println("No Book");
            }
            // 找到该书后就输出 出版社编号和同出版社编号且同年份的书籍个数
            else System.out.println(info.substring(0, info.length() - 4) + " " + count.get(info));
        }
    }
}

同样是使用 Map ,但在统计数量的时候用到了一个陌生的方法

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        // 输入出版社信息个数
        int n = sc.nextInt();
        // 输入图书信息个数
        int m = sc.nextInt();
        sc.nextLine();
        // count 根据 出版社编号和出版年份 来记录 出现次数
        Map<String, Integer> count = new HashMap<>();
        // bookInfo 根据 ISBN 来记录当前书籍的 出版社编号和出版年份
        Map<String, String> bookInfo = new HashMap<>();
        // 出版社的消息没有用,全部消去
        for (int i = 0; i < n; i ++) {
            String str = sc.nextLine();
        }
        // 输入图书信息
        for (int i = 0; i < m; i ++) {
            String[] s = sc.nextLine().split(",");
            // 题目有说信息可能重复录入,如果已经有该图书的信息,就要跳过,避免重复记录
            if (bookInfo.get(s[0]) != null) continue;
            // time 为时间
            String time = s[3].substring(0, 4);
            // 以图书的 ISBN (唯一)为关键字,出版社编号和出版年份为值 存进 bookInfo
            bookInfo.put(s[0], s[1] + time);
            // 根据 出版社编号和出版年份 来统计出现次数
            count.merge(s[1] + time, 1, (a, b) -> count.get(s[b] + time) + b);
        }
        while (sc.hasNextLine()) {
            // 输入图书的 ISBN
            String str = sc.nextLine();
            // 根据图书的 ISBN 获取对应的 出版社编号和出版年份
            String info = bookInfo.get(str);
            // 如果 info == null 证明没有找到该书
            if(info == null) {
                System.out.println("No Book");
            }
            // 找到该书后就输出 出版社编号和同出版社编号且同年份的书籍个数
            else System.out.println(info.substring(0, info.length() - 4) + " " + count.get(info));
        }
    }
}

Map.merge()方法使用说明

第二种,使用 Set ,可能代码有点多,但容易理解

import java.util.HashSet;
import java.util.Objects;
import java.util.Scanner;
import java.util.Set;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        // 输入出版社信息个数
        int n = sc.nextInt();
        // HashSet 具有去重功能,直接添加即可
        Set<PubInfo> pubInfos = new HashSet<>();
        // 输入图书信息个数
        int m = sc.nextInt();
        // HashSet 具有去重功能,直接添加即可
        Set<BookInfo> bookInfos = new HashSet<>();

        sc.nextLine();
        String str;
        // 输入出版社信息
        for (int i = 0; i < n; i++) {
            str = sc.nextLine();
            pubInfos.add(new PubInfo(str.split(",")));
        }
        // 输入图书信息
        for (int i = 0; i < m; i++) {
            str = sc.nextLine();
            bookInfos.add(new BookInfo(str.split(",")));
        }
        // 输入isbn
        while (sc.hasNext()) {
            str = sc.next();
            // 判断有没有该图书
            BookInfo ans = null;
            for (BookInfo book : bookInfos) {
                if (book.isbn.equals(str)) {
                    ans = book;
                    break;
                }
            }
            // 如果没有,则直接输出
            if (ans == null) {
                System.out.println("No Book");
            } else {
                // 如果有,计算该类图书同年的个数
                int count = 0;
                // 该书出版时间
                String ansDate = ans.date.substring(0, 4);
                for (BookInfo book : bookInfos) {
                    // 书籍出版时间
                    String bookDate = book.date.substring(0, 4);
                    // 如果是同一个出版社并且是同一年出版的就加一
                    if (ans.number.equals(book.number) && ansDate.equals(bookDate)) {
                        System.out.println(book);
                        count ++;
                    }
                }
                System.out.println(ans.number + " " + count);
            }
        }
        sc.close();
    }
}

// 出版社信息其实没得用,就是用来混淆的,不需要重写比较方法
class PubInfo{
    String number;
    String name;
    String address;

    public PubInfo(String ... str) {
        this.number = str[0];
        this.name = str[1];
        this.address = str[2];
    }
}

// 需要重写比较方法,利用 Set 对象去重
class BookInfo{
    String isbn;
    String number;
    String name;
    String date;
    String price;

    public BookInfo(String ... str) {
        this.isbn = str[0];
        this.number = str[1];
        this.name = str[2];
        this.date = str[3];
        this.price = str[4];
    }

    // 因为每一本书的 ISBN 是独一无二的,所以只要比较 ISBN 就行了
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        BookInfo bookInfo = (BookInfo) o;
        return Objects.equals(isbn, bookInfo.isbn);
    }

    @Override
    public int hashCode() {
        return Objects.hash(isbn);
    }
}
实验内容: 1.类和对象的定义类和对象的定义类和对象的定义类和对象的定义,实现,实现,实现StudentStudentStudent成绩类的基本员定义成绩类的基本员定义成绩类的基本员定义成绩类的基本员定义成绩类的基本员定义成绩类的基本员定义;类的基本函数功能类的基本函数功能类的基本函数功能类的基本函数功能:学号的学号的提取,成绩的基本计算。提取,成绩的基本计算。提取,成绩的基本计算。提取,成绩的基本计算。提取,成绩的基本计算。 2.构造函数和析构造函数和析构造函数和析构造函数和析构造函数和析,实现对类象自动初始化和释放,实现对类象自动初始化和释放,实现对类象自动初始化和释放,实现对类象自动初始化和释放,实现对类象自动初始化和释放,实现对类象自动初始化和释放,实现对类象自动初始化和释放; 3.静态成员静态成员,实现数据共享,实现数据共享,实现数据共享,实现数据共享,实现数据共享;静态成员函数功能静态成员函数功能静态成员函数功能静态成员函数功能静态成员函数功能:计算N个学生的某科成绩总分和平均个学生的某科成绩总分和平均个学生的某科成绩总分和平均个学生的某科成绩总分和平均个学生的某科成绩总分和平均个学生的某科成绩总分和平均个学生的某科成绩总分和平均分。 4.友元函数和类友元函数和类友元函数和类友元函数和类,实现非类函数对私有据的访问功能,实现非类函数对私有据的访问功能,实现非类函数对私有据的访问功能,实现非类函数对私有据的访问功能,实现非类函数对私有据的访问功能,实现非类函数对私有据的访问功能,实现非类函数对私有据的访问功能,实现非类函数对私有据的访问功能,实现非类函数对私有据的访问功能;友元函数功能:计算任友元函数功能:计算任友元函数功能:计算任友元函数功能:计算任友元函数功能:计算任友元函数功能:计算任友元函数功能:计算任两个学生的某科成绩差。两个学生的某科成绩差。两个学生的某科成绩差。两个学生的某科成绩差。两个学生的某科成绩差。 5.友元类,实现友元类,实现友元类,实现友元类,实现友元类,实现TeacherTeacherTeacher与StudentStudentStudent类静态数据共享类静态数据共享类静态数据共享类静态数据共享;友元函数功能:通过班号友元函数功能:通过班号友元函数功能:通过班号友元函数功能:通过班号友元函数功能:通过班号友元函数功能:通过班号提取某班科成绩总分和平均。提取某班科成绩总分和平均。提取某班科成绩总分和平均。提取某班科成绩总分和平均。提取某班科成绩总分和平均。提取某班科成绩总分和平均。提取某班科成绩总分和平均。 6.派生类,实现访问基保护成员的功能派生类,实现访问基保护成员的功能派生类,实现访问基保护成员的功能派生类,实现访问基保护成员的功能派生类,实现访问基保护成员的功能派生类,实现访问基保护成员的功能派生类,实现访问基保护成员的功能派生类,实现访问基保护成员的功能派生类,实现访问基保护成员的功能派生类,实现访问基保护成员的功能;派生类函数功能:根据某个学总分派生类函数功能:根据某个学总分派生类函数功能:根据某个学总分派生类函数功能:根据某个学总分派生类函数功能:根据某个学总分派生类函数功能:根据某个学总分派生类函数功能:根据某个学总分派生类函数功能:根据某个学总分派生类函数功能:根据某个学总分计算等级。计算等级。 7.虚函数虚函数,实现虚函数支持的动态联编;功能:为一等学生发放奖金。,实现虚函数支持的动态联编;功能:为一等学生发放奖金。,实现虚函数支持的动态联编;功能:为一等学生发放奖金。,实现虚函数支持的动态联编;功能:为一等学生发放奖金。,实现虚函数支持的动态联编;功能:为一等学生发放奖金。,实现虚函数支持的动态联编;功能:为一等学生发放奖金。,实现虚函数支持的动态联编;功能:为一等学生发放奖金。,实现虚函数支持的动态联编;功能:为一等学生发放奖金。,实现虚函数支持的动态联编;功能:为一等学生发放奖金。,实现虚函数支持的动态联编;功能:为一等学生发放奖金。,实现虚函数支持的动态联编;功能:为一等学生发放奖金。,实现虚函数支持的动态联编;功能:为一等学生发放奖金。,实现虚函数支持的动态联编;功能:为一等学生发放奖金。,实现虚函数支持的动态联编;功能:为一等学生发放奖金。,实现虚函数支持的动态联编;功能:为一等学生发放奖金。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qing影

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值