遍历map的键值对的方法(深入浅出)

map特点就是采用了 Key-value键值对映射的方式进行存储 。下面我们谈谈遍历map的方式。下面的内容默认读者对map集合的基本用法有所了解。

一、遍历map(不使用泛型)

不使用泛型的map的声明与赋值:

Map map=new HashMap<>();    map.put("cn", "中国");    map.put("us", "美国");

(1)使用for循环遍历,先取到key

for(Object key: map.keySet()) {      String value=(String) map.get(key);      System.out.println(key+"-"+value);    }

(2)使用Iteator迭代器拿到每个key,再拿值

Iterator iterator=map.keySet().iterator();    while(iterator.hasNext()) {      String key=(String) iterator.next();      String value=(String) map.get(key);      System.out.println(key+"-"+value);    }

    (3)先拿到Map的键值对,然后再分别取出来

 Set mapset = map.entrySet();//返回的是set集合,里面的数据是obj类型,键值对类型。    for (Object object : mapset) {      Map.Entry me=(Entry) object;//拿到每一个键值对是map.entry      Object key=me.getKey();      Object value=me.getValue();      System.out.println((String)key+"-"+(String)value);    }

以上是不使用泛型的map集合,我们可以看出在取值的时候都需要强制类型转换,比较麻烦,容易出错。下面我们对以上的遍历使用泛型。

二、遍历map集合(使用泛型)

使用泛型的map的声明与赋值:

Map<String,String> map1=new HashMap<>();//对map限制写入的键值对类型都为string    map1.put("cn", "中国");    map1.put("us", "美国");

(1)对fo循环遍历进行改造。

for(String key: map1.keySet()) {          String value= map1.get(key);          System.out.println(key+"-"+value);        }

(2)对Iterator迭代器遍历进行改造。

Iterator<String> iterator1=map1.keySet().iterator();        while(iterator1.hasNext()) {          String key=iterator1.next();          String value= map1.get(key);          System.out.println(key+"-"+value);        }

   (3)对第三种思路进行改造。

 Set<Map.Entry<String, String>> mapset1 = map.entrySet();//返回的是set集合,里面的数据是Map.Entry<String, String>类型,键值对类型。        for (Map.Entry<String, String>object1 : mapset1) {          System.out.println(object1.getKey()+"-"+object1.getValue());//尤其是这种,大大减少了出错和代码量        }

     通过上面的对比可以看出,当我们对集合使用泛型后,参数化了类型,在编译时不符合类型的就编译报错,取值时也不用强制类型转换,减少了出错率,同时也减少了代码量。所有以后建议使用集合时,对集合使用泛型。

三、下面介绍一个map深入的实例。

在项目开发中,我需要把从数据库查到的泛型为Permission的list集合如下:根据属性permission_group_name进行分类 。这是我们需要map集合实现,将permission_group_name作为键,因为map的键底层是set集合,是无序不可重复的,然后map的值为泛型为Permission的list集合。

Permission{pid=1, pname='权限管理', permission_group_id=1, permission_group_name='用户管理', href='limit'}-------------------------Permission{pid=2, pname='黑名单管理', permission_group_id=1, permission_group_name='用户管理', href='heimingdan'}-------------------------Permission{pid=3, pname='课程审核', permission_group_id=2, permission_group_name='课程管理', href='shen.com'}-------------------------Permission{pid=4, pname='评价审核', permission_group_id=2, permission_group_name='课程管理', href='ping.com'}-------------------------Permission{pid=7, pname='信息修改', permission_group_id=3, permission_group_name='个人信息管理', href='updatemessage'}-------------------------Permission{pid=8, pname='信息查看', permission_group_id=3, permission_group_name='个人信息管理', href='seemessage'}-------------------------Permission{pid=5, pname='上传课程', permission_group_id=2, permission_group_name='课程管理', href='addcoursedescribe'}-------------------------Permission{pid=6, pname='我的课程', permission_group_id=2, permission_group_name='课程管理', href='meclass.com'}-------------------------

(1)我们声明符合我们需要的map集合。注意1使用泛型,这能减少许多麻烦,根据需求,我们的键为string类型,值为List集合。

Map<String, ArrayList<Permission>> map = new HashMap<String, ArrayList<Permission>>();

(2)我们对要操作的数据使用for循环进行遍历,往map里面添加。看不懂的话请回看map的神奇用法一文。

 for (Permission p : permissions) {            String name = p.getPermission_group_name();//拿到类中键的值对应的属性值            if (!map.containsKey(name)) {//判断map是否已经有了该键。            //没有该键的话,我们新建list,往里面存                ArrayList<Permission> mList = new ArrayList<Permission>();                mList.add(p);                map.put(name, mList);            } else {            //有该键的话,我们根据键拿到map中的list集合值,往后追加                ArrayList<Permission> pList = map.get(name);                pList.add(p);                map.put(name, pList);            }        }

(3)这样我们就完成了需求,下面我们遍历map集合,查看一下。

 Iterator iterator=map.keySet().iterator();        System.out.println("要变成的map数据");        while(iterator.hasNext()) {            String key=(String) iterator.next();            List<Permission> value=(List<Permission>) map.get(key);            System.out.println(key+"-"+value+"===================");        }

(4)结果如下:一共得到三对。

用户管理-[Permission{pid=1, pname='权限管理', permission_group_id=1, permission_group_name='用户管理', href='limit'}, Permission{pid=2, pname='黑名单管理', permission_group_id=1, permission_group_name='用户管理', href='heimingdan'}]===================个人信息管理-[Permission{pid=7, pname='信息修改', permission_group_id=3, permission_group_name='个人信息管理', href='updatemessage'}, Permission{pid=8, pname='信息查看', permission_group_id=3, permission_group_name='个人信息管理', href='seemessage'}]===================课程管理-[Permission{pid=3, pname='课程审核', permission_group_id=2, permission_group_name='课程管理', href='shen.com'}, Permission{pid=4, pname='评价审核', permission_group_id=2, permission_group_name='课程管理', href='ping.com'}, Permission{pid=5, pname='上传课程', permission_group_id=2, permission_group_name='课程管理', href='addcoursedescribe'}, Permission{pid=6, pname='我的课程', permission_group_id=2, permission_group_name='课程管理', href='meclass.com'}]

(5)在我的项目中,实现的效果是根据数据库中的数据动态显示左导航。效果图如下 :

以上是对map用法的理解,觉得不错的话关注一下吧,或者分享给需要的人。

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卧龙不言

欢迎关注java基础笔记公众号

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值