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
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
iterator1=map1.keySet().iterator(); while(iterator1.hasNext()) {
String key=iterator1.next();
String value= map1.get(key);
System.out.println(key+"-"+value);
}
(3)对第三种思路进行改造。
Set
> mapset1 = map.entrySet();//返回的是set集合,里面的数据是Map.Entry 类型,键值对类型。 for (Map.Entry
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> map = new HashMap>();
(2)我们对要操作的数据使用for循环进行遍历,往map里面添加。看不懂的话请回看map的神奇用法一文。
for (Permission p : permissions) {
String name = p.getPermission_group_name();//拿到类中键的值对应的属性值
if (!map.containsKey(name)) {//判断map是否已经有了该键。
//没有该键的话,我们新建list,往里面存
ArrayList
mList = new ArrayList (); mList.add(p);
map.put(name, mList);
} else {
//有该键的话,我们根据键拿到map中的list集合值,往后追加
ArrayList
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
value=(List ) 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用法的理解,觉得不错的话关注一下吧,或者分享给需要的人。