在Java删除List中的所有重复的内容

评论 0 浏览 0 2014-06-12

1.绪论

在这个快速教程中,我们将学习如何清理List中的重复元素。首先,我们将使用普通的Java,然后是Guava,最后是一个基于Java 8 Lambda的解决方案。

本教程是Java –Back to Basic”系列的一部分

2.使用普通Java删除列表中的重复内容

我们可以用标准的Java集合框架通过一个Set轻松地从List中移除重复的元素。

public void 
  givenListContainsDuplicates_whenRemovingDuplicatesWithPlainJava_thenCorrect() {
    List<Integer> listWithDuplicates = Lists.newArrayList(5, 0, 3, 1, 2, 3, 0, 0);
    List<Integer> listWithoutDuplicates = new ArrayList<>(
      new HashSet<>(listWithDuplicates));

    assertThat(listWithoutDuplicates, hasSize(5));
    assertThat(listWithoutDuplicates, containsInAnyOrder(5, 0, 3, 1, 2));
}

正如我们所看到的,原来的名单没有变化。

在上面的示例中,我们使用了 HashSet 实现,它是一个无序集合。因此,清理后的 listWithoutDuplicates 的顺序可能与原始 listWithDuplicates 的顺序不同。

如果我们需要保留顺序,我们可以使用LinkedHashSet来代替。

public void 
  givenListContainsDuplicates_whenRemovingDuplicatesPreservingOrderWithPlainJava_thenCorrect() {
    List<Integer> listWithDuplicates = Lists.newArrayList(5, 0, 3, 1, 2, 3, 0, 0);
    List<Integer> listWithoutDuplicates = new ArrayList<>(
      new LinkedHashSet<>(listWithDuplicates));

    assertThat(listWithoutDuplicates, hasSize(5));
    assertThat(listWithoutDuplicates, containsInRelativeOrder(5, 0, 3, 1, 2));
}

进一步的阅读。

Java集合的面试问题

Java – 合并多个集合

如何用Java查找列表中的一个元素

3.使用Guava删除列表中的重复内容

我们也可以用Guava来做同样的事情。

public void 
  givenListContainsDuplicates_whenRemovingDuplicatesWithGuava_thenCorrect() {
    List<Integer> listWithDuplicates = Lists.newArrayList(5, 0, 3, 1, 2, 3, 0, 0);
    List<Integer> listWithoutDuplicates 
      = Lists.newArrayList(Sets.newHashSet(listWithDuplicates));

    assertThat(listWithoutDuplicates, hasSize(5));
    assertThat(listWithoutDuplicates, containsInAnyOrder(5, 0, 3, 1, 2));
}

在这里,原来的名单也保持不变。

同样,清理过的列表中的元素的顺序可能是随机的。

如果我们使用LinkedHashSet的实现,我们将保留初始的顺序。

public void 
  givenListContainsDuplicates_whenRemovingDuplicatesPreservingOrderWithGuava_thenCorrect() {
    List<Integer> listWithDuplicates = Lists.newArrayList(5, 0, 3, 1, 2, 3, 0, 0);
    List<Integer> listWithoutDuplicates 
      = Lists.newArrayList(Sets.newLinkedHashSet(listWithDuplicates));

    assertThat(listWithoutDuplicates, hasSize(5));
    assertThat(listWithoutDuplicates, containsInRelativeOrder(5, 0, 3, 1, 2));
}

4.使用Java 8 Lambdas从列表中删除重复的内容

最后,让我们看看一个新的解决方案,使用Java 8中的Lambdas。我们将使用Stream API中的distinct()方法,根据equals()方法返回的结果,返回一个由不同元素组成的流。

此外,对于有序的流,不同元素的选择是稳定的。这意味着,对于重复的元素,在相遇顺序中首先出现的元素被保留下来。

public void 
  givenListContainsDuplicates_whenRemovingDuplicatesWithJava8_thenCorrect() {
    List<Integer> listWithDuplicates = Lists.newArrayList(5, 0, 3, 1, 2, 3, 0, 0);
    List<Integer> listWithoutDuplicates = listWithDuplicates.stream()
     .distinct()
     .collect(Collectors.toList());

    assertThat(listWithoutDuplicates, hasSize(5));
    assertThat(listWithoutDuplicates, containsInAnyOrder(5, 0, 3, 1, 2));
}

我们有三个快速的方法来清理List中的所有重复项目。

5.总结

在这篇文章中,我们演示了使用普通Java、Google Guava和Java 8删除列表中的重复内容是多么的简单。

所有这些例子和片段的实现都可以在GitHub项目中找到。这是一个基于Maven的项目,所以它应该很容易导入和运行。

最后更新2023-03-11
0 个评论