兩個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 去刪除數據,留下的數據是兩邊沒有找到的,這種算法也是可行 

算法加邏輯,靈活多變,還是需要在實際過程中實踐哪種更優算法。

發佈了144 篇原創文章 · 獲贊 28 · 訪問量 16萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章