我希望将一个列表中的项目添加到另一个列表中,但不包含重复项。我使用了下面的方法,涉及到一个集合。这是实现最终结果的最有效方法吗?有没有更简洁的更新 lista 以包含唯一集合对象的方法?
Set setboth = new HashSet(lista);
setboth.addAll(listb);
lista.clear();
lista.addAll(setboth);
或者您可以尝试以下方法:
list1.removeAll(list2);
list2.addAll(list1);
但是使用List来实现可能比使用HashSet慢,这取决于List的实现类。此外,它会更改其中一个原始列表(这可能或可能不是您上下文中的选项)。
看起来不错,但这取决于项目是否实现了equals和hashCode方法。
HashSet数据结构依赖于有效的equals和hashCode实现。如果一个类的toString()方法显示出两个实例的相同字符串,除非这两个实例返回相同的哈希码并在equals方法上返回true,否则它们将不被视为相同的实例。
equals()
和hashCode()
方法也应该是可以的。 - Robin Greenequals()
方法。equals()
方法定义了两个对象何时被视为相等。 - Robin Greenequals
是不够的,如果你正在使用基于哈希的数据结构,你还需要覆盖 hashCode
。 - Kaj集合
,则可以直接使用setBoth
,而无需将所有结果复制到lista
中。// CollectionUtils.intersection(ownerList, bcList) 返回一个包含 ownerList 和 bcList 中共同元素的集合
CollectionUtils.union 将 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;
}
我知道这个问题已经有答案了,但我认为还有另一种方法可以解决它,并且可能对来到这个页面的某些人有帮助。
lista.add(listb);
listb.clear();
listb.add(new ArrayList<String>(new LinkedHashSet<String>(lista)));
Set
而不是一个List
。 - Peter Lawrey