两个List进行比较,进行新增,删除,修改等操作

第一  两个list要进行 新增,删除,和修改的标记,然后到数据进行相应操作, 

  能够处理的情况有两种,

第一种 是把两种结果相互比较,放到MAP里,取出为NULL说明是另一个LIST没有的KEY,

第二种, 找到相同的ID值后, 标记出来,然后加到删除的list里

第一种方式的代码   封装到map是为了减少循环次数  , 还是可以进行优化, 用SET去重,那就不需要封装两次LIST

 List<Map<String, Object>> snmpList = snmpMapper.getSnmpListAll();
            //OSS同步的数据
            JSONArray snmpResult = json.getJSONArray("result");

            if (snmpList.size() < 0) {
                snmpMapper.insertAllSnmp(snmpResult);
                return;
            }
            //存入json 拿值比较更新
            JSONObject snmpobj = new JSONObject();
            snmpList.stream().forEach(s -> {
                HashMap setmap = (HashMap) s;
                JSONObject so = new JSONObject(setmap);
                snmpobj.put(so.getString("id"), so);
            });

            JSONArray updateList = new JSONArray();
            JSONArray addList = new JSONArray();
            snmpResult.stream().forEach(s -> {
                JSONObject sp = (JSONObject) s;
                JSONObject somap = snmpobj.getJSONObject(sp.getString("id"));
                if (null == somap) {
                    addList.add(sp);
                } else if (sp.getString("id").equals(somap.getString("id")) && !sp.toString().replace("\"", "").equals(
                        somap.toString().replace("\"", ""))) {
                    String createTime = utils.getLocalTime();
                    sp.put("createTime", createTime);
                    updateList.add(sp);
                }
            });
            //要删除的SNMP
            JSONArray deleteList = new JSONArray();
            //封装到key
            JSONObject resutobj = new JSONObject();
            snmpResult.stream().forEach(r -> {
                JSONObject res = (JSONObject) r;
                resutobj.put(res.getString("id"), res);
            });
            snmpList.stream().forEach(sm -> {
                HashMap setmap = (HashMap) sm;
                JSONObject sp = new JSONObject(setmap);
                JSONObject resmap = resutobj.getJSONObject(sp.getString("id"));
                if (null == resmap) {
                    deleteList.add(sp);
                }
            });

第二种方式代码   就是两次循环 这种效率较低,数据量小的时候可以这样操作

 List listresult = snmplist

 List  listoss = osslist;

for(int i=0;i<listresult.size();i++){

   obj = listresult.get(i);
  // 给一个标记,如果在另一个list找到相同KEY的数据了,就标记不是新增
  boolean flag =true;
   for(int h=0;h<listoss.size();h++){
      ossobj = listoss.get(i);
     if(obj.get("id").equal(ossobj.get("id"))){
      flag = false;  说明找到相同的值了,
}
    //如果里面的list循环完之后, 都没有找到相同的值,说明是新增加
     if(flag=true){
       addlist.add(obj);
    }
}

}

删除的办法也是同理,   用listoss 去循环 listresult这个结果,得到的数据就是删除,
区别就是两个list相互比较, 如果不相互比较,还可以用SET 去删除数据,留下的数据是两边没有找到的,这种算法也是可行 

算法加逻辑,灵活多变,还是需要在实际过程中实践哪种更优算法。

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值