我想将列表中的项目添加到另一个列表而不重复。我使用了下面涉及一组的方法。这是实现最终结果的最有效方式吗?是否有更简洁的方法来更新lista以包含唯一的setboth对象?
Set setboth = new HashSet(lista);
setboth.addAll(listb);
lista.clear();
lista.addAll(setboth);
答案 0 :(得分:9)
看起来不错,但这取决于项是否实现了equals和hashCode。
HashSet数据结构依赖于equals和hashCode的有效实现。具有为两个实例显示相同字符串的toString()实现的类将不被视为同一实例,除非两个实例也返回相同的哈希代码,并在equals上返回true。
答案 1 :(得分:9)
或者你可以这样做:
list1.removeAll(list2);
list2.addAll(list1);
但它可能比使用HashSet慢,具体取决于List实现类。此外,它会更改原始列表之一(在您的上下文中可能是也可能不是选项)
答案 2 :(得分:2)
如果最终结果可以是任何Collection
,您可以直接使用setBoth
,而无需将所有结果复制到lista
。
答案 3 :(得分:1)
// CollectionUtils.intersection(ownerList,bcList)返回一个包含ownerList,bcList的集合
CollectionUtils.union将list of bc联合成一个唯一的列表
private List getAuthorisedBCList(List bcList,Set> bcOwnersList){ List listList = new ArrayList();
for(List<String> ownerList : bcOwnersList){
listList = (List<String>) CollectionUtils.union(listList,CollectionUtils.intersection(ownerList, bcList));
}
return listList;
}
答案 4 :(得分:1)
我知道这个问题已经得到解答,但我认为还有另一种方法可以帮助有人登陆此页面。
lista.add(listb);
listb.clear();
listb.add(new ArrayList<String>(new LinkedHashSet<String>(lista)));