您的位置:首页 > 其它

Map集合与List集合混合使用对比

2014-11-29 21:24 239 查看
作为一个刚开始学编程的人来说,下面文字的一些表述肯定会有错误,希望前辈们多多批评,或者等以后我自己回过头来觉得自己当初怎么这么菜,那也说明我进步了。嗯,就这样开始吧!

        问题是自学时候视频里的:学校-教室-学生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等集合到底都是什么关系?都是我之后要去搞懂的地方。 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  迭代器 泛型 集合
相关文章推荐