前言:
有兩波對象集合,本地的存儲的數據可以隨意更換位置。而從服務器拉下來的數據是按服務器排序固定的。
需求:
按本地的排序適配從服務器拉去的新數據。
思路:
從服務器拉到數據後,和本地數據做一次匹配。按本地數據的排序更新本地數據。
步驟:
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沒有的數據。
然後把摘出的數據和本地先排序,再將本地沒有的數據填充到排好序的摘出的數據後。
完美,開幹。
步驟
- NetList 和 LocList 對比,重複的值先拿出來,放到臨時集合 CList 中
- 同時 NetList 有 而 LocList 中沒有的數據,放到臨時集合 DList 中(因爲以 netList 爲準,若locList 有而 netList 沒有,則直接忽略掉,若上一步中 netList 和 locList 沒有重複的,則全部進入DList)
- 然後按 LocList 排序 CList 的值, 因爲CList是臨時存放,這裏CList等於代替了部分 netList 的值
- 排序完成後,就是 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就是要的數據。