问题描述:
在实际项目开发中需要存储各种类型的对象数据,一般使用数组存储存在存储个数不确定问题,通常使用集合类型来存储。给你的问题是,在图书信息系统中一个出版社和图书信息,一个出版社发行多门图书,每图书属于一个出版社,在图书查询中往往需要进行某图书属于那个出版社,该出版社在发行某图书的当年发行了多少图书等相关查询,如果使用集合合理存储了出版社和图书对象,进行相关查询将变得容易。
本问题使用标准输入出版社和图书信息,然后查出某图书的出版社,以及该出版社在该图书出版当年发行图书的种类数目。
输入:
标准输入,输入的第一行为两个正整数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
代码展示
import java.util.*;
public class Text4 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//得到要输入的出版社和图书的行数
int n = sc.nextInt();
int m = sc.nextInt();
//读掉回车键
String line = sc.nextLine();
//创建图书的集合
HashMap<String, book> bookMap = new HashMap<String, book>();
//创建出版社的集合
HashMap<String, press> pressMap = new HashMap<String, press>();
//得到输入的出版社信息
for(int i = 0 ; i < n; i ++){
line = sc.nextLine();
String[] str = line.split(",");
press p = new press(str[0]);
pressMap.put(str[0], p);
}
//得到输入的图书信息
for(int i = 0; i < m; i ++){
line = sc.nextLine();
String [] str = line.split(",");
book b = new book(str[0], str[1], Integer.parseInt(str[3].substring(0, 4)));
//判断图书是否重复
if(bookMap.get(str[0]) == null){
bookMap.put(str[0],b);
press myPress = pressMap.get(b.pressId);
myPress.bookSet.add(b);
}
}
//查找相关的图书信息
while(sc.hasNextLine()){
//得到要查找的图书ISBN
line = sc.nextLine();
if(bookMap.get(line) == null){
//无此书
System.out.println("No Book");
}else{
book b = bookMap.get(line);
//通过本书找到他的出版社
press myPress = pressMap.get( b.pressId );
//得到与此书同年出版的书的数量
int count = getCount(myPress.bookSet,b.year);
//输出题目要求
System.out.println(b.pressId + " " + count);
}
}
}
private static int getCount(HashSet<book> bookSet, int year) {
//通过循环遍历得到同年的图书数量并返回
int count = 0;
for (book book : bookSet) {
if(book.year == year) {
count ++;
}
}
return count;
}
}
//下面的两个类我都进行了简化,只保留了做题需要的信息
class book{
String ISBN;
press myPress;
String pressId;
int year;
book(String ISBN, String pressId, int year ){
this.ISBN = ISBN;
this.pressId = pressId;
this.year = year;
}
}
class press{
String id;
HashSet<book> bookSet = new HashSet<book>();
press(String id){
this.id = id;
}
}
注意点:
1.要找到图书与出版社之间的联系,并熟练如何运用他们之间的联系,例如如何从图书找到出版社并找到同年发行的书
2.在找到日期的数据时不要忘记它是字符串要进行转换,转换的时候要注意我们只需年份,所以我们要对日期数据进行截取