作为一个刚开始学编程的人来说,下面文字的一些表述肯定会有错误,希望前辈们多多批评,或者等以后我自己回过头来觉得自己当初怎么这么菜,那也说明我进步了。嗯,就这样开始吧!
问题是自学时候视频里的:学校-教室-学生id和name,用两种不同的思路来实现打印教室名称以及学生id和name。以下思路也都是视频里面的,在这里只是自己做一个总结。
思路一:学校教室的名称-班级,id和name,分别可以作为Map集合里的键和值,也就是分别都有映射关系。这个思路的特点是使用了两层的嵌套关系,因为学校和教室是一对关系,而id和name这对关系又是教室下的。所以在创建Map集合时就与一般的稍微有点不同,具体见下面代码:
//创建学校czbk
HashMap<String,HashMap<String,String>> czbk=new HashMap<String,HashMap<String,String>>();
//给其中一个班传学生的id和name
HashMap<String,String> yure=new HashMap<String,String>();
//给另一个班传学生id和name
HashMap<String,String> jiuye=new HashMap<String,String>();
czbk.put("yureban",yure);
czbk.put("jiuyeban",jiuye);
yure.put("01","zhangsan");//yure里面的01,zhangsan分别是id和name
yure.put("02","lisi");
jiuye.put("01","zhaoliu");//jiuye里面的01,zhaoliu分别是id和name
jiuye.put("02","wangwu");
可以看到上面代码的第一行HashMap里面“值”(与键对应的值)泛型类的表述是HashMap<String,String>,是因为班级里面的学生id和name也是一个HashMap集合的键和值。这两层嵌套关系在HashMap<String,HashMap<String,String>>这句代码里面也就体现出来了。
下面的步骤使用迭代器(Iterator)来取出集合里面的元素,由于有两层关系,所以第二层的id和name用单独一个方法getStuInfo()来进行获取,使代码更有阅读性:
//遍历czbk集合,获取所有教室,使用的是keySet()方法,也可以使用entrySet()方法 Iterator<String> it=czbk.keySet().iterator(); while(it.hasNext()) { String roomName=it.next();//keySet()方法获取这个集合里的key(键) HashMap<String,String> room=czbk.get(roomName);//获取jiuyeban对应的值jiuye,以及yureban对应值yure System.out.println(roomName);//打印班级:jiuyeban,yureban getStuInfo(room);//将教室传入getStuInfo方法,获取每个教室里面的学生id以及name } }
//getStuInfo()方法来对教室里的id和name进行获取,同样用的是keySet()方法 public static void getStuInfo(HashMap<String,String> roomMap)//传入某个班级的名字 { Iterator<String> it=roomMap.keySet().iterator(); while(it.hasNext()) { String id=it.next();//获取键:id String name=roomMap.get(id);//取出id所对应的name System.out.println(id+".."+name); } } }思路二:学校里的教室-班级作为一对键值,创建一个学生类,id和name只是作为这个学生类的属性,不再具有映射关系(键值对)。代码如下:
首先要创建一个学生类:
class Student { private String id;//分别将id和name私有化,封装这个学生类里面的变量 private String name; Student(String id,String name)//构造函数 { this.id=id; this.name=name; } public String toString() { return id+"..."+name; } }接着是demo()方法里面创建一个HashMap集合传入教室名称(键)和班级(值),班级里面对应的是学生类的id和name,由于没有映射关系,所以使用List集合创建这两个班级,代码如下:
public static void demo()//使用学生类,让有映射关系的学校与班级,没有映射关系的学生id和name一同应用 { //创建学校czbk HashMap<String,List<Student>> czbk=new HashMap<String,List<Student>>(); //创建两个班级,由于是学生对象,学生对象里不存在映射关系,所以用List集合 List<Student> yure=new ArrayList<Student>(); List<Student> jiuye=new ArrayList<Student>(); czbk.put("yureban",yure);//将教室名称以及班级传入学校 czbk.put("jiuyeban",jiuye); yure.add(new Student("01","zhangsan"));//将学生类里面的id和name分别传入对应的班级 yure.add(new Student("02","lisi")); jiuye.add(new Student("01","zhaoliu")); jiuye.add(new Student("03","wangwu"));接下来就是与思路一一样的获取集合里面的元素以及学生类里面的id和name,在代码里面两种获取键值的方法都列在下面,由于学生的id和name不再具有映射关系,所以用迭代器(Iterator)可以直接取出同时取出:
//第一种获取方式,entrySet /* Set<Map.Entry<String,List<Student>>> entrySet=czbk.entrySet(); Iterator<Map.Entry<String,List<Student>>> it=entrySet.iterator(); while(it.hasNext()) { Map.Entry<String,List<Student>> me=it.next(); String roomName=me.getKey(); List<Student> room=me.getValue(); System.out.println(roomName); getInfo(room); } */ //第二种获取方式,keySet Set<String> keySet=czbk.keySet(); Iterator<String> it=keySet.iterator(); while(it.hasNext()) { String roomName=it.next(); List<Student> room=czbk.get(roomName); System.out.println(roomName); getInfo(room);//单独定义的getInfo()方法获取学生的id和name } } public static void getInfo(List<Student> list)//把学生类作为对象,id和name不再有映射关系,所以下面代码可以直接取出id和name { Iterator<Student> it=list.iterator(); while(it.hasNext()) { Student s=it.next(); System.out.println(s); } }
代码里面的其他一些细节,比如Map集合里面的HashMap与TreeMap有什么区别?List和Set集合在使用迭代器(Iterator)时候有什么内在的区别?List,Set,Map,Collection等集合到底都是什么关系?都是我之后要去搞懂的地方。