我有两个字符串列表,我正在删除重复项:
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
有没有更好的方法来实现这一目标?即声明较少。
答案 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