兩個String型別集合的比對(或 兩個表的比對)
阿新 • • 發佈:2019-02-05
equBaseInfoSubList為主要基準, openStatusList比它多的要刪除,少的要新增。
自己在專案中遇到的,兩個表的比對。
主要思想:
數學中的交集思想:A,B兩個集合。先找出A,B的交集,A-交集=需要新增的部分;B-交集=需要刪除的部分。目測是最為簡單的方法。
一開始想從正面去解決,發現要繞很多路,想去找他們的不同部分,結果可以想象,很難實現。腦子一轉,可以找他們相同的部分,真是益處多多,少了很多步驟。
如下是兩個表的查詢list的比對方法,其中主表的guid是從表的外來鍵(equSubId)。
public void importEquBaseInfoSub(List <EquBaseInfoSub> equBaseInfoSubList, List <EquOpenStatus> openStatusList, PageContext pc) throws Exception {
/*openStatus表和equBaseInfoSub表相同的部分*/
List <String> samelist = new ArrayList <String>();
Map <String, Object> subMap = new HashMap <String, Object>();
Map <String, Object> osMap = new HashMap <String, Object>();
for (EquBaseInfoSub sub : equBaseInfoSubList) {
subMap.put(sub.getGuid(), sub);
}
for (EquOpenStatus os : openStatusList) {
osMap.put(os.getEquSubId(), os);
}
Set <String> subSet = subMap.keySet();
Set <String> osSet = osMap.keySet();
/*查詢 兩個集合相同的部分*/
for (String o : osSet) {
for (String s : subSet) {
if (o.equals(s)) {
samelist.add(o);
continue;
}
}
}
int size = samelist.size();
for (int i = 0; i < size; i++) {
String sameEml = samelist.get(i);
/*獲取需要新增的資料 (subSet集合減去samelist)*/
subSet.remove(sameEml);
/*獲取需要刪除的資料(osSet集合減去samelist)*/
osSet.remove(sameEml);
}
for (String o : osSet) {
//del
EquOpenStatus equOpenStatus = new EquOpenStatus();
equOpenStatus = (EquOpenStatus) osMap.get(o);
pc.putEntity(equOpenStatus);
SpringConfigHelper.getDeleteHandler().execute(pc);
}
for (String s : subSet) {
//add
EquBaseInfoSub equBaseInfoSub = new EquBaseInfoSub();
equBaseInfoSub = (EquBaseInfoSub) subMap.get(s);
final EquOpenStatus equOpenStatus = new EquOpenStatus();
equOpenStatus.setEquSubId(equBaseInfoSub.getGuid());
equOpenStatus.setEquType(EquType.EQU);
equOpenStatus.setOpenDate(sysDate);
equOpenStatus.setOpenFlag("Y");
pc.putEntity(equOpenStatus);
SpringConfigHelper.getSaveHandler().execute(pc);
}
}