1. 程式人生 > >兩個String型別集合的比對(或 兩個表的比對)

兩個String型別集合的比對(或 兩個表的比對)

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);
        }

    }