List Map String,Object去重复

业务场景:在别人调用我们接口保存数据的时候,而我们要通过传过来的数据在数据库中找出哪些数据是已经存在的,存在的做更新操作,不存在的做插入操作。在这种业务场景的时候可能你要用到,List<Map<String,Object>>去重复。

假如我们接收的数据json:

"{"goodsOrds":[{"dljgId\":"e9369b7bc2c149f690fbd1f1734cf78d","userId":null,"goodsCode":"sp125","serviceState":"0 "}].....}" ;

    这串json数据,你把它解析成List<Map<String,Object>>,

例如

Map<String, Object> mapJson = JSONObject.fromObject(messageBody); 

List<Map<String,Object>> list =  (List<Map<String, Object>>) mapJson.get("goodsOrds");//这个是我们解析后的数据

//下面的操作是为了找出在数据库存在的记录,以便知道哪些数据是需要做更新操作的。

List<String> dljgIds = new ArrayList<String>();

for (Map<String, Object> map : list) {
    String dljgId = map.get("dljgId").toString();
    dljgIds.add(dljgId);
}

List<Map<String, Object>> KhSpxxs = crmKhService.getKhSpxx(dljgIds);//这个是在数据库找出来的,也就是说着些数据是需要更新操作的,但是我们需要找到那些数据是需要插入数据库的,所以我们要比较这两个集合:list,KhSpxxs。

即list减去KhSpxxs就是需要做插入操作的数据。这里存在一个问题,如何比较Map<String,Object>是相同的呢?下面提供一种做法:通过构造一个map,然后通过key来识别map里面的对象是不是相同的对象。

 /**
 * list转map为了后面去重复,注意我们这边的dljgId是唯一的。
 */
Map<String,Map<String, Object>>  updateKhSpxxMap = new HashMap<String, Map<String,Object>>();
Map<String,Map<String, Object>>  updateJsonData = new HashMap<String, Map<String,Object>>();
for (Map<String, Object> map2 : updateKhSpxx) {
    updateKhSpxxMap.put((String)map2.get("dljgId"), map2);
}

for (Map<String, Object> list : lists) {
    updateJsonData.put((String)list.get("dljgId"), list);
}

 for (Map.Entry<String, Map<String, Object>> entry: updateJsonData.entrySet()) {
     String key = entry.getKey();
    if(!updateKhSpxxMap.containsKey(key)){
         Map<String, Object> insertKhSpxxMap = updateJsonData.get(key);
        if(insertKhSpxxMap!=null&&insertKhSpxxMap.size()>0){
            insertKhSpxxMap.put("cjsj",DateUtil.format(new Date(),"yyyy-MM-dd HH:mm:ss"));
            isOk = crmKhDao.insertKhSpxx(insertKhSpxxMap);
       }
    }

 }

假如是List<Pojo>的话,比较简单,只需要在对应pojo重写equals方法,指定参数,标识这个对应是唯一 的,然后在比较即可。





  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值