【Java】关于Map解析List<Map<String, String>>的心得

本文介绍如何使用Map在MyBatis中统计实体属性的数量,通过SQL查询新生报到和未报到数目,并解析List<Map<String,String>>类型的返回结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、前言
在众多开发的项目中都会建立实体、model等包含了众多的属性和方法的类,但是有的时候就要求查询一个实体中的一部分,返回一个实体会有很多的空字段,非常浪费。这个时候我们可以使用Map

二、举个例子
我要统计新生报到数目和未报到数目,他们在数据库中是用0/1表示的,’是否报到(0/1 否/是)’,所以我就需要通过sql查询出所有0和1的个数各有多少个。查出来后,存储到map中。
在这里插入图片描述
我用了如下的sql语句查询出了:
在这里插入图片描述
这样,我就获取了0和1个个数,为了标识那个是0,那个是1,我就用了map存储。利用mybatis,返回机制是 resultType=”java.util.HashMap”,方法的返回值是 List

    <select id="selectReportedAndUnreportedEnrollStudent" resultType="java.util.HashMap" >
        SELECT
        SUM(CASE WHEN is_registry = 0 then 1 else 0 END) as zerocount ,
        SUM(CASE WHEN is_registry = 1 then 1 else 0 END) as onecount
        FROM t_enroll_student
    </select>

唠叨了这么多,终于到了重点,我要解析一个List
三、解析Map
List<Map<String ,String >>的类型,这个类型可以放多个键值对,使用的时候要对这个map集合解析:用两个for循环,第一个for循环获取list集合中的map,第二个解析map中的数据,根据m.keySet()就可以得到查询出来的字段,然后根据get(key)获取对应的对象,这里要注意是获取的对象,然后在把对象转换成字符串,就可以显示出来了。

             for (Map<String, String> m :list){
                   for (String k :m.keySet()){
                       Object ob = m.get(k);
                       System.out.println(k + " : "+ob.toString() );
                   }
               }

显示结果:

onecount : 11
zerocount : 66

四、原理剖析
在上面的代码中,小编用到了m.keySet(),这个可以说是Map的一类。

获取Map的值主要有四种方法,这四种方法又分为两类,一类是上面咱们使用的m.keySet(),另一类是通过m.entrySet()获取。

关于这两类的区别:

m.keySet() ,先获取所有的key集合,当需要查询value的时候,通过key来查询。

m.entrySet(),是直接将key和value的键值对直接取出来,只查询一次。

相比之下,entrySet的效率比较高一点。了解更多
小编写了一个测试方法:

 @Test
    public void testMap(){
        Map<String,String> map = new HashMap<String,String>();
        map.put("b","1");
        map.put("a","3");
        map.put("c","6");
        map.put("d","8");
        map.put("e","9");
        map.put("f","3");

        //通过map.keySet()方法
        //方法一:通过循环得到key的值,然后通过get(key)获取value;
        /*for(String key : map.keySet()){
            String value = map.get(key);
            System.out.println(key+"  "+value);
        }*/
        //方法二:使用迭代器,获取key;然后判断迭代器是否有下一个。
       /* Iterator<String> iter = map.keySet().iterator();
        while(iter.hasNext()){
            String key=iter.next();
            String value = map.get(key);
            System.out.println(key+" "+value);
        }*/
        //通过map.entrySet()方法
        //方法三:循环map里面的每一对键值对,然后获取key和value
        for(Map.Entry<String, String> vo : map.entrySet()){
            vo.getKey();
            vo.getValue();
            System.out.println(vo.getKey()+"  "+vo.getValue());
        }

        /*//方法四:使用迭代器,获取key
        Iterator<Entry<String,String>> iter = map.entrySet().iterator();
        while(iter.hasNext()){
            Entry<String,String> entry = iter.next();
            String key = entry.getKey();
            String value = entry.getValue();
            System.out.println(key+" "+value);
        }*/
    }

可以看出每种方法还是各有特点的,小编是越来越喜欢使用Map了。

五、小结
通过学习Map,存储键值对,使用也很方便,小编会在以后的时候在合适的时候使用Map的。以后会对Map做跟多的总结。希望大家会喜欢。

如果你想要比较两个List<Map<String, String>>之间的差异数据,可以按照以下步骤进行: 1. 遍历第一个List中的每一个Map,对于每一个Map中的键值对,检查它是否在第二个List中的Map中存在,如果不存在,则将该键值对添加到差异数据集合中。 2. 遍历第二个List中的每一个Map,对于每一个Map中的键值对,检查它是否在第一个List中的Map中存在,如果不存在,则将该键值对添加到差异数据集合中。 下面是代码示例: ``` public List<Map<String, String>> diff(List<Map<String, String>> list1, List<Map<String, String>> list2) { List<Map<String, String>> diffList = new ArrayList<>(); // 检查第一个List中的每一个Map for (Map<String, String> map1 : list1) { // 检查每一个键值对是否在第二个List中的Map中存在 boolean found = false; for (Map<String, String> map2 : list2) { if (map2.containsKeyAll(map1)) { found = true; break; } } // 如果不存在,则将该键值对添加到差异数据集合中 if (!found) { diffList.add(map1); } } // 检查第二个List中的每一个Map for (Map<String, String> map2 : list2) { // 检查每一个键值对是否在第一个List中的Map中存在 boolean found = false; for (Map<String, String> map1 : list1) { if (map1.containsKeyAll(map2)) { found = true; break; } } // 如果不存在,则将该键值对添加到差异数据集合中 if (!found) { diffList.add(map2); } } return diffList; } ``` 这段代码返回的是两个List中的差异数据集合。其中,`containsKeyAll`是一个自定义的方法,用于检查一个Map中的所有键值对是否都存在于另一个Map中。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值