从两个列表中删除重复项

时间:2017-12-02 18:46:15

标签: java lambda collections

我有两个字符串列表,我正在删除重复项:

List<String> list1 = Arrays.asList("1", "2", "3", "4");
List<String> list2 = Arrays.asList("1", "4", "5", "6");
List<String> duplicates = list1.stream().filter(s -> list2.contains(s)).collect(Collectors.toList());
list1.removeAll(duplicates);
list2.removeAll(duplicates);

结果是:

list1 = 2, 3
list2 = 5, 6

有没有更好的方法来实现这一目标?即声明较少。

2 个答案:

答案 0 :(得分:0)

值得考虑的一个可能性是创建Set<String>并将这些列表添加到其中。 Set允许仅为其自身添加唯一值,它可以防止添加重复项。

使用Set的第一种方法:创建一个包含两个列表交集的Set。添加到新的,删除重复列表只有在您检查到源的每个对象都不存在于先前创建的Set重复项中时才会发生。

第二种方式(仅当你的列表不关心自己持有重复项时 - 例如,在第一种方法中,你有两倍相同的值):为第一个和第二个列表创建一个Set,并将这些列表添加到它们中,然后检查重复项。

正如我在评论中提到的,我可能会误解问题并寻找“另一个”,而不是“更有效”的方式来实现你所要求的,但也许它实际上可能是有用的。

答案 1 :(得分:0)

您可以使用在 removeAll 接口中定义的 Collection

<块引用>

布尔值 removeAll(Collection c)

删除此集合的所有元素,这些元素也包含在 指定的集合(可选操作)。在这个电话之后 返回,此集合将不包含与 指定集合。

// init
List<String> sourceList1 = Arrays.asList("1", "2", "3", "4");
List<String> sourceList2 = Arrays.asList("1", "4", "5", "6");

// you need to create duplicate collection, because removeAll modify collection 
List<String> resultList1 = new ArrayList(sourceList1);
List<String> resultList2 = new ArrayList(sourceList2);

//remove duplicates from collections
resultList1.removeAll(sourceList2); // second from first
resultList2.removeAll(sourceList1); // first from second