在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));
}
进一步的阅读。
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的项目,所以它应该很容易导入和运行。
0 个评论