2011-05-23 42 views
9

我想將列表中的項目添加到另一個列表中,沒有任何重複。我已經使用了下面涉及到一套的方法。這是實現最終結果的最有效方式嗎?有沒有更好的方法來更新lista以包含獨特的setboth對象?結合兩個沒有重複的列表

Set setboth = new HashSet(lista); 
setboth.addAll(listb); 
lista.clear(); 
lista.addAll(setboth); 
+3

這就是我該怎麼做的。 – jjnguy 2011-05-23 14:41:22

+2

聽起來像是你想要一個'Set'而不是'List'。 – 2011-05-23 16:29:12

回答

9

看起來不錯,但它取決於項目是否實現equals和hashCode。

HashSet數據結構依賴於equals和hashCode的有效實現。具有顯示兩個實例的相同字符串的toString()實現的類不會被視爲同一實例,除非兩個實例都返回相同的哈希代碼,並在equals上返回true。

+0

即使他們不這樣做,基於對象身份工作的默認'equals()'和'hashCode()'方法應該沒問題。 – 2011-05-23 14:45:23

+2

如果他創建了兩個不同實例應該被視爲同一個實例的類(例如,具有相同社會安全號的兩個實例應該被視爲一個人的Person類) – Kaj 2011-05-23 14:54:01

+0

是的,但是他應該重寫equals() )'方法。 'equals()'方法*定義了兩個對象應該被認爲是相等的。 – 2011-05-23 14:55:29

2

如果最終結果可以是任何Collection,那麼您可以直接使用setBoth,而無需將所有結果複製到lista

9

或者,你可以這樣做:

list1.removeAll(list2); 
list2.addAll(list1); 

但它可能會比使用HashSet的,這取決於List實現類的慢。此外,它改變了原來的名錶之一(這可能是也可能不是在你的情況下的一個選項)

1

// CollectionUtils.intersection(ownerList,bcList)返回一個集合包含兩個ownerList,bcList

CollectionUtils .union將bc列表合併到一個唯一列表中

private List getAuthorisedBCList(List bcList,Set> bcOwnersList)ListListList = new ArrayList();

for(List<String> ownerList : bcOwnersList){ 
     listList = (List<String>) CollectionUtils.union(listList,CollectionUtils.intersection(ownerList, bcList)); 
    } 
    return listList; 
} 
1

我知道這個問題已經回答了,但我覺得有這樣做的另一種方式,它可能是有人登陸此頁面上有幫助。

lista.add(listb); 
listb.clear(); 
listb.add(new ArrayList<String>(new LinkedHashSet<String>(lista)));