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