首先,我們將構建兩個映射,每個映射對應一個映射名稱。然後我們遍歷鍵集之間的差異,處理任何類型的對象都有這個名字。這些地圖讓我們避免在列表中掃描,尋找具有該名稱的對象。 (在使用Map而不是Multimap時,我依賴於the asker's comment on another answer,在每個列表中,名稱是唯一的。如果您仍在使用Java 7,請將方法引用替換爲Function實現。)
Map<String, Object1> map1 = Maps.uniqueIndex(list1, Object1::getName);
Map<String, Object2> map2 = Maps.uniqueIndex(list2, Object1::getName);
for (String name : Sets.difference(map1.keySet(), map2.keySet()))
processObject1(map1.get(name));
for (String name : Sets.difference(map2.keySet(), map1.keySet()))
processObject2(map2.get(name));
如果你想要做的是建立列表或設置對象恰好一個列表,processObject1
和processObject2
只需將對象添加到集合。
uniqueIndex
的迭代順序是輸入迭代,並difference
返回具有相同的迭代順序作爲第一個參數一個setView,這樣你就可以處理他們出現在輸入列表的順序對象,如果訂單與你的問題有關。
的Java 8流基本上提供相同的功能:
Map<String, Object1> map1 = list1.stream().collect(Collectors.toMap(Function.identity(), Object1::getName));
Map<String, Object2> map2 = list2.stream().collect(Collectors.toMap(Function.identity(), Object2::getName));
map1.keySet().stream().filter(n -> !map2.keySet().contains(n)).map(map1::get).forEachOrdered(o1 -> processObject1(o1));
map2.keySet().stream().filter(n -> !map1.keySet().contains(n)).map(map2::get).forEachOrdered(o2 -> processObject1(o2));
同樣,你可以更換forEachOrdered
呼叫與collect(Collectors.toList())
,如果你只是想收集的對象。
你的名單有多大? – 2014-09-10 15:22:24
爲什麼for循環比任何其他解決方案都貴?除非你正在做一些非常聰明的並行執行,否則你將不得不精確地檢查和轉換每個對象一次。 – 2014-09-10 22:12:41
不是真的傑夫,試着比較兩個對象列表,通常最終做兩次for循環與另一個for循環。 n * n + n * n。但是,基於這些列表創建地圖是n + n + n + n。我問這個問題,因爲我徘徊有沒有比4xns更好的解決方案 – 2014-09-11 08:59:24