解决<Map<String,Object>>List里缺失数据的问题:跳出来你会看得更全面

简介: 解决<Map<String,Object>>List里缺失数据的问题:跳出来你会看得更全面

记一次问题解决思路


需求是根据时间范围查一些数据然后计算,假设有180个设备,理想状态下应该查回来180条数据,


数据格式是<Map<String,Object>>List 里面每个map就是一条数据,理想状态下它们是连续的,也就是

{valMin=5.0, valAvg=27.933, valMax=37.9, sid=1}
{valMin=5.0, valAvg=27.933, valMax=37.9, sid=2}
{valMin=5.0, valAvg=27.933, valMax=37.9, sid=3}
....

这样的


那么问题就来了,假设库里这个时间段有一个设备或多个设备没有上传数据,那么就会出现断裂

{valMin=5.0, valAvg=27.933, valMax=37.9, sid=1}
{valMin=5.0, valAvg=27.933, valMax=37.9, sid=2}
{valMin=5.0, valAvg=27.933, valMax=37.9, sid=3}
{valMin=5.0, valAvg=27.933, valMax=37.9, sid=4}
{valMin=5.0, valAvg=27.933, valMax=37.9, sid=6}
{valMin=5.0, valAvg=27.933, valMax=37.9, sid=7}
....

可以看到,sid为5的数据没有查到.为了保证数据连续


所以要为没有数据的设备添加一条各项value为null的记录

{valMin=5.0, valAvg=27.933, valMax=37.9, sid=1}
{valMin=5.0, valAvg=27.933, valMax=37.9, sid=2}
{valMin=5.0, valAvg=27.933, valMax=37.9, sid=3}
{valMin=5.0, valAvg=27.933, valMax=37.9, sid=4}
{valMin=null, valAvg=null, valMax=null, sid=5}
{valMin=5.0, valAvg=27.933, valMax=37.9, sid=6}
{valMin=5.0, valAvg=27.933, valMax=37.9, sid=7}
....

就像这样


看起来是不是很容易,其实确实容易,但是在这里走了弯路,所以要记录下来

最开始我是想着这还不简单,我把最大的设备数量拿到,然后循环设备从1到180,然后看哪个map的sid和我的记录不一样


比方说循环到5,结果因为缺失了sid为5的数据,所以这个记录的sid和我循环到的index一定不一样


我就可以在这里添加一条数据那就完事

 

但是不是那么容易

 

因为我循环是这样对比的

if((i + 1) != Integer.valueOf(Val.get(i).get("sid").toString()))   //注:i从0起  sid从1到180

假设少了一条记录,那么总记录就是179条,而不是180条,这样的话到了第180次循环的时候,就会报空指针异常


因为访问了不存在的角标 180

 

 

那么用可以用Map的containsValue(Object value)方法来判断是否有当前这个sid吗?其实也是不行的,


这个方法只能判断map里是否有这个值,而不能判断指定key下是否有这个值,比方说我们现在有


valMin, valAvg, valMax, sid 这四个key,只要其中有一个包含指定的value就算包含,那么结果也是不准确的,我不能确定它包含的这个值是不是我想要的sid的值


一时间工作似乎陷入了停滞....


还好我旁边有大佬


大佬说:你为什么不跳出来呢


我说:啥跳出来???


大佬说:你这样,你把sid作为key,把每个map作为value塞到一个map里然后放入一个List再去遍历哪里缺少了相应的sid就是哪里缺少了数据


像这样

Map<Integer, Map<String, Object>> listmap = new HashMap();
for (Map<String, Object> map : Val) {
   listmap.put(Integer.valueOf(map.get("sid").toString()), map);
}

塞进去

 

然后这样


for (int i = 0; i < sid; i++) {
    if (!listmap.containsKey(i + 1)) {
        HashMap<String, Object> hashMap = new HashMap<>();
        hashMap.put("sid", i + 1);
        hashMap.put("ValMax", null);
        hashMap.put("ValMin", null);
        hashMap.put("ValAvg", null);
        Val.add(i, hashMap);
        continue;
    }
}

注:add里要加i,否则会添加到list末尾位置

 

我突然对大佬产生了仰慕之情,大佬就是大佬,看问题的角度都不一样(还是自己太菜了)


这件事说明解决问题的时候不要钻牛角尖,要尝试从更高的角度去解决问题,可能没有那么复杂呢

 

相关文章
|
27天前
|
存储 Java API
深入剖析Java Map:不只是存储数据,更是设计艺术的体现!
【10月更文挑战第17天】在Java编程中,Map是一种重要的数据结构,用于存储键值对,并展现了设计艺术的精髓。本文深入剖析了Map的设计原理和使用技巧,包括基本概念、设计艺术(如哈希表与红黑树的空间时间权衡)、以及使用技巧(如选择合适的实现类、避免空指针异常等),帮助读者更好地理解和应用Map。
81 3
SpringMVC入门到实战------5、域对象共享数据 Request、Session、Application、Model、ModelAndView、Map、ModelMap的详细使用及代码实例
这篇文章详细解释了在IntelliJ IDEA中如何使用Mute Breakpoints功能来快速跳过程序中的后续断点,并展示了如何一键清空所有设置的断点。
SpringMVC入门到实战------5、域对象共享数据 Request、Session、Application、Model、ModelAndView、Map、ModelMap的详细使用及代码实例
|
2月前
ES6中map对象的使用,确实比Object好使哈
ES6中Map对象的使用优势,包括任意类型作为键、直接获取大小、增删查改操作等。Map的键可以是函数、对象、NaN等,支持forEach循环和for...of循环。
32 1
ES6中map对象的使用,确实比Object好使哈
|
1月前
|
存储 分布式计算 NoSQL
大数据-40 Redis 类型集合 string list set sorted hash 指令列表 执行结果 附截图
大数据-40 Redis 类型集合 string list set sorted hash 指令列表 执行结果 附截图
27 3
|
2月前
|
算法
你对Collection中Set、List、Map理解?
你对Collection中Set、List、Map理解?
36 5
|
2月前
|
存储 JSON NoSQL
redis基本数据结构(String,Hash,Set,List,SortedSet)【学习笔记】
这篇文章是关于Redis基本数据结构的学习笔记,包括了String、Hash、Set、List和SortedSet的介绍和常用命令。文章解释了每种数据结构的特点和使用场景,并通过命令示例演示了如何在Redis中操作这些数据结构。此外,还提供了一些练习示例,帮助读者更好地理解和应用这些数据结构。
redis基本数据结构(String,Hash,Set,List,SortedSet)【学习笔记】
|
3月前
|
XML Java API
List与String相互转化方法汇总
本文汇总了List与String相互转化的多种方法,包括使用`String.join()`、`StringBuilder`、Java 8的Stream API、Apache Commons Lang3的`StringUtils.join()`以及Guava的`Joiner.on()`方法实现List转String;同时介绍了使用`split()`方法、正则表达式、Apache Commons Lang3的`StringUtils.split()`及Guava的`Splitter.on()`方法实现String转List。
List与String相互转化方法汇总
域对象共享数据model、modelAndView、map、mapModel、request。从源码角度分析
这篇文章详细解释了在IntelliJ IDEA中如何使用Mute Breakpoints功能来快速跳过程序中的后续断点,并展示了如何一键清空所有设置的断点。
域对象共享数据model、modelAndView、map、mapModel、request。从源码角度分析
|
3月前
|
存储 安全 Java
java集合框架复习----(4)Map、List、set
这篇文章是Java集合框架的复习总结,重点介绍了Map集合的特点和HashMap的使用,以及Collections工具类的使用示例,同时回顾了List、Set和Map集合的概念和特点,以及Collection工具类的作用。
java集合框架复习----(4)Map、List、set
|
3月前
|
存储 算法 Java
Go 通过 Map/Filter/ForEach 等流式 API 高效处理数据
Go 通过 Map/Filter/ForEach 等流式 API 高效处理数据