JAVA集合框架的应用练习
这几日学习了Java集合框架的相关知识,为了巩固对集合框架中一些具体实现接口的学习和使用,特意做了一个针对性的练习题。
下面让我们一起来看一下吧~
图书管理存储:
在图书管理系统中为了方便管理图书,将图书划分为几个类别。每个类别下有很多图书,每本图书都有相对应的类别,这就具备了一对多的关系映射,即一个类别对应多本图书。在这种情况下就可以使用
Map 映射来存储类别和图书信息,其键为 Category(类别) 类型,值为 List 类型(Book
类为图书类),然后使用嵌套循环遍历输出每个类别所对应的多个图书信息。
我们来分析一下这个系统的实现原理
具体的实现步骤如下:
(1) 创建表示图书类别的 Category 类,在该类中有两个属性:id 和 name,分别表示编号和类别名称,并实现了它们的 setXxx() 和 getXxx() 方法。
(2) 创建表示图书明细信息的 BookInfo 类,在该类中包含 5 个属性:id、name、price、author 和 startTime,分别表示图书编号、名称、价格、作者和出版时间,同样实现了它们的 setXxx() 和 getXxx() 方法创建 CategoryDao 类,在该类中定义一个泛型的 Map 映射,其键为 Category 类型的对象,值为 List 类型的对象,并定义printCategoryInfo() 方法,用于打印类别和图书明细信息。
(4) 创建测试类 Test01,在该类中定义 4 个 类型 对象和 8 个 图书 对象,并将 8 个 图书 对象分成 4 组,存储到 4 个 List 集合中,然后将 4 个 类别 对象和 4 个 List 集合按照——对应的关系存储到 类别 类中的 类别map 映射中,调用方法输出。
此处先提供我在遇到此题时的第一种做法:
//Category类
public class Category {
private int id;
public Category(int id) {
// TODO Auto-generated constructor stub
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name2) {
this.name = name2;
}
private String name;
@Override
public String toString() {
// TODO Auto-generated method stub
return name;
}
}
//BookInfo用以存放图书明细
import java.util.ArrayList;
import java.util.List;
public class BookInfo {
private int id;
private String name;
private int price;
private String author;
private int startTime;
//此处将四个List声明在BookList中,在BookList中写了4个list的具体实现方法
List<BookInfo> Javalist=new ArrayList<>();
List<BookInfo> Pythonlist=new ArrayList<>();
List<BookInfo> Htmllist=new ArrayList<>();
List<BookInfo> Clist=new ArrayList<>();
public BookInfo(int id,String name,int price,String author,int startTime) {
// TODO Auto-generated constructor stub
this.id=id ;
this.name = name;
this.price = price;
this.author = author;
this.startTime = startTime;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public int getStartTime() {
return startTime;
}
public void setStartTime(int startTime) {
this.startTime = startTime;
}
public void addJavaBook(int id,String name,int price,String author,int startTime){
Javalist.add(new BookInfo( id, name, price, author, startTime));
}
public void addHtmlBook(int id,String name,int price,String author,int startTime){
Htmllist.add(new BookInfo( id, name, price, author, startTime));
}
public void addPythonBook(int id,String name,int price,String author,int startTime){
Pythonlist.add(new BookInfo( id, name, price, author, startTime));
}
public void addCBook(int id,String name,int price,String author,int startTime){
Clist.add(new BookInfo( id, name, price, author, startTime));
}
//重写了tostring方法,不然的话返回的值是一个地址
@Override
public String toString() {
// TODO Auto-generated method stub
return "书号:"+id+" ,书名:《 "+name+" 》,价格:"+price+"元 ,作者:"+author+" ,出版时间:"+startTime;
}
}
//继承了BookInfo类
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
public class CategoryDao extends BookInfo {
public CategoryDao(int id,String name,int price,String author,int startTime) {
super(id, name, price, author, startTime);
// TODO Auto-generated constructor stub
}
Map<Category, List<BookInfo>> map=new HashMap<>();
//Map<Integer, String> map1=new HashMap<>();
public List<BookInfo> putJavaBookinfo(int id,String name,int price,String author,int startTime){
super.addJavaBook(id, name, price, author, startTime);
return Javalist;
}
public List<BookInfo> putPythonBookinfo(int id,String name,int price,String author,int startTime){
super.addPythonBook(id, name, price, author, startTime);
return Pythonlist;
}
public List<BookInfo> putHtmlBookinfo(int id,String name,int price,String author,int startTime){
super.addHtmlBook(id, name, price, author, startTime);
return Htmllist;
}
public List<BookInfo> putCBookinfo(int id,String name,int price,String author,int startTime){
super.addCBook(id, name, price, author, startTime);
return Clist;
}
public void addCategory(int id,String name){
Category c1=new Category(id);
c1.setName(name);
c1.setId(id);
if(id==1){
//为书号判断类型区间
map.put(c1, Javalist);
}else if(id==2){
map.put(c1, Htmllist);
}else if(id==3){
map.put(c1,Pythonlist);
}else if(id==4){
map.put(c1,Clist);
}
}
//此处实现了打印Map集合的方法
public void printCategoryInfo(){
Iterator<Category> it=map.keySet().iterator();
while(it.hasNext()){
Category a=it.next();
System.out.println(a+":");
System.out.println(map.get(a));
}
} }
//测试类 测试类中定义了4个类型,8种对象且每个类型对应的有2套书籍,最后调用输出方法
public class Test01 {
public static void main(String[] args) {
CategoryDao d1=new CategoryDao(0, null, 0, null, 0);
d1.addJavaBook(1, "java编程思想", 43, "张三", 20080801);
d1.addJavaBook(1, "java从删库到跑路", 28, "李四", 20080802);
d1.putHtmlBookinfo(2, "Html开发规范", 23, "王五", 20080803);
d1.putHtmlBookinfo(2, "Html之禅", 28, "赵六", 20080804);
d1.putPythonBookinfo(3, "Python与大数据", 50, "王五", 20080805);
d1.putPythonBookinfo(3, "Python基础", 45, "赵六", 20080806);
d1.putCBookinfo(4, "C++从入门到烧书", 61, "孙七", 20080807);
d1.putCBookinfo(4, "C++弃坑之路", 49, "周八", 20080808);
d1.addCategory(1,"Java类 ");
d1.addCategory(2, "Html类");
d1.addCategory(3, "Python类");
d1.addCategory(4, "C语言类");
d1.printCategoryInfo();
}
}
运行截图
经过指导后做出了代码方便易写的,且冗余小的代码:
//Category测试类
public class Category {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
//BookInfo类
public class BookInfo {
public BookInfo(int id,String name,double price,String author,String starTime){
this.id=id;
this.name=name;
this.price=price;
this.author=author;
this.starTime=starTime;
}
private int id;
private String name;
private double price;
private String author;
private String starTime;
@Override
public String toString() {
return "书号:"+id+" ,书名:《 "+name+" 》,价格:"+price+"元 ,作者:"+author+" ,出版时间:"+starTime;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getStarTime() {
return starTime;
}
public void setStarTime(String starTime) {
this.starTime = starTime;
}
}
//CategoryDao类,只定义Map函数,实现添加循环遍历输出添加完成后的Map集合
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class CategoryDao {
public Map<Category,ArrayList<BookInfo>> map = new HashMap<>();
public void printCategoryInfo(){
Iterator<Category> it = map.keySet().iterator();
while(it.hasNext()){
Category key =it.next();
System.out.print("类型编号:"+key.getId()+",类型名:"+key.getName());
// System.out.println(map.get(key));
System.out.println();
System.out.println(map.get(key));
// for(BookInfo book:map.get(key)){
// System.out.print(book);
// }System.out.println();
}
}
}
//测试类,添加对象,并定义了4个BookList类型的List用以存放BookInfo添加进去的属性
import java.util.ArrayList;
import java.util.List;
public class Test01 {
public static void main(String[] args) {
ArrayList<BookInfo> Javalist = new ArrayList<BookInfo>();
Javalist.add(new BookInfo(1, "java编程思想", 43, "张三", "20080801"));
Javalist.add(new BookInfo(2, "java从删库到跑路", 28, "李四", "20080802"));
ArrayList<BookInfo> Htmllist = new ArrayList<BookInfo>();
Htmllist.add(new BookInfo(3, "Html开发规范", 23, "王五", "20080803"));
Htmllist.add(new BookInfo(4, "Html之禅", 28, "赵六", "20080804"));
ArrayList<BookInfo> Pythonlist = new ArrayList<BookInfo>();
Pythonlist.add(new BookInfo(5, "Python基础", 45, "赵六", "20080806"));
Pythonlist.add(new BookInfo(6, "Python与大数据", 50, "王五", "20080805"));
ArrayList<BookInfo> Clist = new ArrayList<BookInfo>();
Clist.add(new BookInfo(4, "C++从入门到烧书", 61, "孙七", "20080807"));
Clist.add(new BookInfo(4, "C++弃坑之路", 49, "周八", "20080808"));
CategoryDao cdao= new CategoryDao();
Category java = new Category();
java.setId(1);
java.setName("Java类书籍");
Category py = new Category();
py.setId(2);
py.setName("Python类书籍");
Category html = new Category();
html.setId(3);
html.setName("Html类书籍");
cdao.map.put(html, Htmllist);
Category c = new Category();
c.setId(4);
c.setName("C语言类书籍");
cdao.map.put(java, Javalist);
cdao.map.put(py, Pythonlist);
cdao.map.put(c, Clist);
cdao.printCategoryInfo();
}
}
运行截图
这些就是对本题的一些解答与思考,在处理此题时,遍历Map集合的值时,其实也就是遍历一个类型是BookInfo类型的List时,想将这个list隔行遍历,其实也就是在Category中实现的时候讲Map集合中的Values对应隔行输出即可。但是我在改的时候,始终不对。
喜欢我的…思路和代码的大佬给我点个赞,如果你有更好的思路,请关注我,希望得到你的指点~
如果你是大神,求带哦…