[算法思路分享]記一次數據匹配

前言:

有兩波對象集合,本地的存儲的數據可以隨意更換位置。而從服務器拉下來的數據是按服務器排序固定的。

需求:

按本地的排序適配從服務器拉去的新數據。

思路:

從服務器拉到數據後,和本地數據做一次匹配。按本地數據的排序更新本地數據。

步驟:

1. 獲取到網絡數據NetList

2. 和本地數據LocList先對比長度

3. 分情況

  • NetList.size = LocList.size
if (netList.size() == locList.size()) {
    for (int j = 0; j < locList.size(); j++) {
        for (int i = 0; i < netList.size(); i++) {
            if (netList.get(i).getName().equals(locList.get(j).getName())) {
                nowList.add(NetList.get(i));
            }
        }
    }
}
  • NetList.size > LocList.size
    因爲 NetList > LocList 所以 先用 NetList - LocList 算出多了幾個值;
    然後將 NetList 和 LocList 重合的值 按(NetList.size = LocList .size 的情況排序)添加到nowList;
    再然後把 多出來的幾個值 添加到nowList中;
if (netList.size() > locList.size()) {
    //按少的排序
    for (int i = 0; i < locList.size(); i++) {
        for (int j = 0; j < locList.size(); j++) {
            if (netList.get(j).getName().equals(locList.get(i).getName())) {
                nowList.add(netList.get(j));
            }
        }
    }
    //多出來的值添加到後面
    for (int i = 0; i < netList.size() - locList.size(); i++) {
        nowList.add(netList.get(netList.size() - (i + 1)));
    }
}
  • NetList.size < LocList.size
    因爲 NetList < LocList 所以 直接遍歷 NetList 和 LocList 對比 NetList 和 LocList 都有的直接填入nowList;
if (netList.size() < locList.size()) {
    for (int j = 0; j < netList.size(); j++) {
        for (int i = 0; i < locList.size(); i++) {
            if (netList.get(j).getName().equals(locList.get(i).getName())) {
                nowList.add(netList.get(j));
            }
        }
    }
}

然後,測了一下 哎 沒問題,很舒服。然後發給測試

萬萬沒想到,剛想放鬆放鬆刷刷博客

測試反饋

順序會回到初始狀態: 第一次好的 刪了兩條數據後再打開就回到初始排序了。
(還好機智 + 了 try-catch 如果有異常就恢復初始狀態,不至於奔潰了)

傻了

這種方式 咋一看沒什麼問題;但是 以上方法只適用於 一次少一條,一次多一條的時候,
要是 一次少兩條,或者一次多一條A數據,少一條B數據,按原來長度 還是相同,但是數據已經變了,這種情況會出問題。

萬全之策:

不管它數據是多了還是少了。

摘出相同的數據,和locList沒有的數據。
然後把摘出的數據和本地先排序,再將本地沒有的數據填充到排好序的摘出的數據後。

完美,開幹。

步驟

  1. NetList 和 LocList 對比,重複的值先拿出來,放到臨時集合 CList 中
  2. 同時 NetList 有 而 LocList 中沒有的數據,放到臨時集合 DList 中(因爲以 netList 爲準,若locList 有而 netList 沒有,則直接忽略掉,若上一步中 netList 和 locList 沒有重複的,則全部進入DList)
  3. 然後按 LocList 排序 CList 的值, 因爲CList是臨時存放,這裏CList等於代替了部分 netList 的值
  4. 排序完成後,就是 NetList +DList 的值,就是最終需要的值。

這種操作不管你多幾條數據,還是少幾條數據,重複的按本排序,少的直接忽略,多的排在本地後面。各種情況其實一次解決了。

//臨時CList和DList
CList = new ArrayList<>();//臨時存放 net 和 loc 重合 的 數據 按net排序
DList = new ArrayList<>();//臨時存放 只有 net 的數據 按net排序
EList = new ArrayList<>();//臨時存放 net 和 loc 重合 的 數據 按loc排序
//這一步,拿出了 本地和網絡重複的部分
for (int i = 0; i < NetList.size(); i++) {
    NO_WAY = 0;
    for (int j = 0; j < locList.size(); j++) {
        if (NetList.get(i).getName().equals(locList.get(j).getName())) {
            CList.add(NetList.get(i));
        } else {
            NO_WAY += 1;
            if (NO_WAY == locList.size()) {
                DList.add(NetList.get(i));
            }
        }
    }
}
//重複部分排序
for (int j = 0; j < locList.size(); j++) {
    for (int i = 0; i < CList.size(); i++) {
        if (CList.get(i).getName().equals(locList.get(j).getName())) {
            EList.add(CList.get(i));
        }
    }
}
//網絡部分加到後面
if (DList.size() > 0) {
    EList.addAll(DList);
}

最後的EList就是要的數據。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章