我想將列表中的項目添加到另一個列表中,沒有任何重複。我已經使用了下面涉及到一套的方法。這是實現最終結果的最有效方式嗎?有沒有更好的方法來更新lista以包含獨特的setboth對象?結合兩個沒有重複的列表
Set setboth = new HashSet(lista);
setboth.addAll(listb);
lista.clear();
lista.addAll(setboth);
我想將列表中的項目添加到另一個列表中,沒有任何重複。我已經使用了下面涉及到一套的方法。這是實現最終結果的最有效方式嗎?有沒有更好的方法來更新lista以包含獨特的setboth對象?結合兩個沒有重複的列表
Set setboth = new HashSet(lista);
setboth.addAll(listb);
lista.clear();
lista.addAll(setboth);
看起來不錯,但它取決於項目是否實現equals和hashCode。
HashSet數據結構依賴於equals和hashCode的有效實現。具有顯示兩個實例的相同字符串的toString()實現的類不會被視爲同一實例,除非兩個實例都返回相同的哈希代碼,並在equals上返回true。
即使他們不這樣做,基於對象身份工作的默認'equals()'和'hashCode()'方法應該沒問題。 – 2011-05-23 14:45:23
如果他創建了兩個不同實例應該被視爲同一個實例的類(例如,具有相同社會安全號的兩個實例應該被視爲一個人的Person類) – Kaj 2011-05-23 14:54:01
是的,但是他應該重寫equals() )'方法。 'equals()'方法*定義了兩個對象應該被認爲是相等的。 – 2011-05-23 14:55:29
如果最終結果可以是任何Collection
,那麼您可以直接使用setBoth
,而無需將所有結果複製到lista
。
或者,你可以這樣做:
list1.removeAll(list2);
list2.addAll(list1);
但它可能會比使用HashSet的,這取決於List實現類的慢。此外,它改變了原來的名錶之一(這可能是也可能不是在你的情況下的一個選項)
// 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;
}
我知道這個問題已經回答了,但我覺得有這樣做的另一種方式,它可能是有人登陸此頁面上有幫助。
lista.add(listb);
listb.clear();
listb.add(new ArrayList<String>(new LinkedHashSet<String>(lista)));
這就是我該怎麼做的。 – jjnguy 2011-05-23 14:41:22
聽起來像是你想要一個'Set'而不是'List'。 – 2011-05-23 16:29:12