解决<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末尾位置

 

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


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

 

相关文章
|
1月前
|
数据安全/隐私保护
作用域通信对象:session用户在登录时通过`void setAttribute(String name,Object value)`方法设置用户名和密码。点击登录按钮后,跳转到另外一个页面显示用户
该博客文章通过示例演示了如何使用session对象的`setAttribute`和`getAttribute`方法在不同页面间传递和显示用户的用户名和密码信息,并说明了如何设置会话的有效期。
作用域通信对象:session用户在登录时通过`void setAttribute(String name,Object value)`方法设置用户名和密码。点击登录按钮后,跳转到另外一个页面显示用户
|
19天前
|
Java API 开发者
代码小妙招:用Java轻松获取List交集数据
在Java中获取两个 `List`的交集可以通过 `retainAll`方法和Java 8引入的流操作来实现。使用 `retainAll`方法更为直接,但会修改原始 `List`的内容。而使用流则提供了不修改原始 `List`、更为灵活的处理方式。开发者可以根据具体的需求和场景,选择最适合的方法来实现。了解和掌握这些方法,能够帮助开发者在实际开发中更高效地处理集合相关的问题。
14 1
|
20天前
|
存储 关系型数据库 MySQL
|
1月前
|
Python
【Pandas】Pandas的DataFrame按行插入list数据或者读取一行并存为csv文件
本文提供了使用Pandas库对DataFrame进行操作的示例代码。
72 0
|
3月前
|
JSON Java 数据格式
如何用String字符串生成JSONObject和JSONArray数据
如何用String字符串生成JSONObject和JSONArray数据
1420 1
|
2月前
|
JSON JavaScript API
JS【详解】Map (含Map 和 Object 的区别,Map 的常用 API,Map与Object 的性能对比,Map 的应用场景和不适合的使用场景)
JS【详解】Map (含Map 和 Object 的区别,Map 的常用 API,Map与Object 的性能对比,Map 的应用场景和不适合的使用场景)
35 0
|
2月前
|
NoSQL Java Redis
Redis09-----List类型,有序,元素可以重复,插入和删除快,查询速度一般,一般保存一些有顺序的数据,如朋友圈点赞列表,评论列表等,LPUSH user 1 2 3可以一个一个推
Redis09-----List类型,有序,元素可以重复,插入和删除快,查询速度一般,一般保存一些有顺序的数据,如朋友圈点赞列表,评论列表等,LPUSH user 1 2 3可以一个一个推
|
2月前
|
存储 语音技术 Python
语音识别,函数综合案例,黑马ATM,/t/t一个对不齐,用两个/t,数据容器入门,数据容器可以分为列表(list)、元组(tuple)、字符串(str)、集合(set)、字典(dict)
语音识别,函数综合案例,黑马ATM,/t/t一个对不齐,用两个/t,数据容器入门,数据容器可以分为列表(list)、元组(tuple)、字符串(str)、集合(set)、字典(dict)
|
3月前
|
Java API
将`List<String>`转换为`List<Long>`
将`List<String>`转换为`List<Long>`
|
3月前
|
Python
【已解决】AttributeError: ‘Index‘ object has no attribute ‘to_list‘
【已解决】AttributeError: ‘Index‘ object has no attribute ‘to_list‘
29 0