2015-09-21 87 views
1

讓我們假設我有一個對象,它看起來像這樣:如何比較兩個對象列表之間的字段?

public class Supermarket { 

    public String supermarketId; 
    public String lastItemBoughtId; 

    // ... 
} 

,我有超市的兩份名單,一個「老」,另一個「新」(即一個是本地的,另一種是從檢索雲)。

List<Supermarket> local = getFromLocal(); 
List<Supermarket> cloud = getFromCloud(); 

我想找出所有對Supermarket對象(給出supermarketId)具有lastItemBoughtId彼此不同的。

第一溶液我想到被迭代第一List,則每次該local.get(i).supermarketId.equals(cloud.get(j).supermarketId),檢查所述i元件的lastItemBoughtId是從j元素的id不同的第一次迭代的迭代的第二個,並且內部。如果不同,我將整個Supermarket對象添加到新列表中。

更清晰,像這樣:

List<Supermarket> difference = new ArrayList<>(); 
for (Supermarket localSupermarket : local) { 
    for (Supermarket cloudSupermarket : cloud) { 
     if (localSupermarket.supermarketId.equals(cloudSupermarket.supermarketId) && 
     !localSupermarket.lastItemBoughtId.equals(cloudSupermarket.lastItemBoughtId)) 
      difference.add(cloudSupermarket); 
    } 
} 

顯然,這看起來大大效率低下。有沒有更好的方法來處理這種情況?

+1

看看這個例子。 http://stackoverflow.com/questions/11260628/how-to-find-the-differences-between-two-array-lists-based-on-a-property –

+0

您不能將列表更改爲地圖?這將使得使用代表ID獲得元素更加容易。 – SomeJavaGuy

回答

4

一個解決方案:

  1. 通過列表一次
  2. 循環通過雲列表運行構造一個地圖使用supermarketId爲重點的本地超市和你比較,查找當地超市從你的地圖。

即的O,而不是爲O(n )

這裏(N)是一個兩行的解決方案:

Map<String, Supermarket> map = getFromLocal().stream() 
    .collect(Collectors.toMap(s -> s.supermarketId, s -> s)); 
List<Supermarket> hasDiffLastItem = getFromCloud().stream() 
    .filter(s -> !map.get(s.supermarketId).lastItemBoughtId.equals(s.lastItemBoughtId)) 
    .collect(Collectors.toList()); 
1

我會把名單之一的Map與作爲鍵入Supermarket ID,然後將超市實例的值迭代到從地圖獲取並比較lastItemBoughtId的值。