【问题标题】:Remove duplicates from two lists从两个列表中删除重复项
【发布时间】:2018-05-16 14:46:12
【问题描述】:

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

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

有没有更好的方法来做到这一点?即用更少的语句。

【问题讨论】:

  • 更好在什么方面?更少的比较,更少的内存消耗?
  • 定义“更好”。如果您的意思是“渐近时间复杂度”,那么您可以通过 HashSets 做得更好。
  • “更好”可以自以为是。小心你问什么。
  • 您想要删除重复项,例如只有唯一的项目,还是想要两组的差异?您现在要删除两个列表中出现的所有项目。对于前者,只需使用 Set。对于后者,这看起来没问题。
  • 删除出现在两个列表中的项目。感谢@OliverCharlesworth 提供使用 HashSet 的提示

标签: java lambda collections


【解决方案1】:

值得考虑的一种可能性是创建Set&lt;String&gt; 并将这些列表添加到其中。 Set 只允许向自身添加唯一值,它防止添加重复项。

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

第二种方式(仅当您的列表不关心保存重复项本身时 - 例如,在第一种方式中,您存在两倍的相同值):为第一个和第二个列表创建一个 Set,并添加这些列表给他们,然后检查重复项。

正如我在 cmets 中提到的那样,我可能会误解问题并寻找“另一种”,而不是寻找“更有效”的方式来实现您所要求的,但也许它实际上可能会有所帮助。

【讨论】:

  • 请解释在这种情况下如何工作。 OP希望完全删除重复项,而不是最多每个值一个。
  • 我可能有点误解,这不是实现它的最有效方法,所以我很抱歉错过了提供“更有效的方法”的部分。 .第一个和第二个列表可以检查该集合的公共部分并将结果存储在新列表中。再次抱歉,我误解了它并想提供另一种方式,而不是最有效的方式。
  • 我不是在谈论 高效 部分。我完全看不出你会如何使用Sets 来尝试从两个数组中删除重复的值。
  • @luk2302 - 从列表转换为集合会将预期运行时间(对于交集逻辑)从 O(n^2) 减少到 O(n)。
  • @OliverCharlesworth 我明白了,从一开始就使用Sets 会起作用,是的。
【解决方案2】:

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

boolean 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-20
    • 2011-04-05
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 2010-11-22
    相关资源
    最近更新 更多