合并两个列表,不包含重复项。

9

我希望将一个列表中的项目添加到另一个列表中,但不包含重复项。我使用了下面的方法,涉及到一个集合。这是实现最终结果的最有效方法吗?有没有更简洁的更新 lista 以包含唯一集合对象的方法?

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

2
听起来你需要一个Set而不是一个List - Peter Lawrey
5个回答

9
您可以这样做:

或者您可以尝试以下方法:

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

但是使用List来实现可能比使用HashSet慢,这取决于List的实现类。此外,它会更改其中一个原始列表(这可能或可能不是您上下文中的选项)。


9

看起来不错,但这取决于项目是否实现了equals和hashCode方法。

HashSet数据结构依赖于有效的equals和hashCode实现。如果一个类的toString()方法显示出两个实例的相同字符串,除非这两个实例返回相同的哈希码并在equals方法上返回true,否则它们将不被视为相同的实例。


即使它们不这样做,基于对象标识工作的默认equals()hashCode()方法也应该是可以的。 - Robin Green
2
不过,如果他已经创建了类,在这些类中,两个不同的实例应该被视为同一个实例(例如,一个人类,其中具有相同社会安全号码的两个实例应被视为一个人),那么情况就不同了。 - Kaj
是的,但他应该重写equals()方法。equals()方法定义了两个对象何时被视为相等。 - Robin Green
是的,它们只是列表中的字符串,因此这种方法完全可以胜任。谢谢你们俩。 - edwardmlyte
2
@Robin Green 覆盖 equals 是不够的,如果你正在使用基于哈希的数据结构,你还需要覆盖 hashCode - Kaj

2
如果最终结果可以是任何类型的集合,则可以直接使用setBoth,而无需将所有结果复制到lista中。

1

// 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;
}

1

我知道这个问题已经有答案了,但我认为还有另一种方法可以解决它,并且可能对来到这个页面的某些人有帮助。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接