当前位置: 首页 > 科技观察

如何找到两个列表之间的差异?

时间:2023-03-16 01:20:13 科技观察

1。概述找出相同数据类型的对象集合之间的差异是一项常见的编程任务。例如,假设我们有一个申请考试的学生列表和另一个通过考试的学生列表。两个列表之间的差异将告诉我们没有通过考试的学生。在Java中,ListAPI中没有明确的方法来查找两个列表之间的差异,尽管有一些非常接近的辅助方法。在本文中,我们将了解如何找到两个列表之间的差异。我们将尝试几种不同的方法,包括纯Java(有和没有Streams),以及使用第三方库,如Guava和ApacheCommonsCollections。2.测试设置首先定义我们将用于测试示例的两个列表:publicclassFindDifferencesBetweenListsUnitTest{privatestaticfinalListlistOne=Arrays.asList("Jack","Tom","Sam","John","James","Jack");privatestaticfinalListlistTwo=Arrays.asList("Jack","Daniel","Sam","Alan","James","George");}3.使用JavaListAPI,我们可以创建列表的副本,然后使用List方法removeAll(),移除所有与另一个相同的元素:Listdifferences=newArrayList<>(listOne);differences.removeAll(listTwo);assertEquals(2,differences.size());assertThat(差异).containsExactly(“汤姆”,“约翰”);让我们把这个倒过来,换个角度找区别:Listdifferences=newArrayList<>(listTwo);differences.removeAll(listOne);assertEquals(3,differences.size());assertThat(differences).containsExactly(“丹尼尔”,“艾伦”,“乔治”);我们还要注意,如果我们要查找两个列表之间的共同元素,List还有一个保留方法。4.使用StreamsAPIJavaStreamAPI可用于对集合中的数据执行顺序操作,包括过滤列表之间的差异:Listdifferences=listOne.stream().filter(element->!listTwo.contains(元素)).collect(Collectors.toList());assertEquals(2,differences.size());assertThat(differences).containsExactly("Tom","John");与第一个示例一样,我们可以切换顺序,以查找与第二个列表不同的元素:Listdifferences=listTwo.stream().filter(element->!listOne.contains(element)).collect(Collectors.toList());assertEquals(3,differences.size());assertThat(差异).containsExactly(“丹尼尔”,“艾伦”,“乔治”);请注意,对于较大的列表操作,List.contains()可能会很昂贵。5.使用第三方库5.1。使用GoogleGuavaGuava包含Sets.difference方法,但要使用它,我们需要先将列表转换为集合:Listdifferences=newArrayList<>(Sets.difference(Sets.newHashSet(listOne),Sets.newHashSet(listTwo)));assertEquals(2,differences.size());assertThat(differences).containsExactlyInAnyOrder("Tom","John");请注意,将列表转换为集合会导致去重和重新排序效果。5.2.使用ApacheCommonsCollectionsApacheCommonsCollections中的CollectionUtils包含removeAll方法。此方法类似于List.removeAll(),但也会为结果创建一个新集合:Listdifferences=newArrayList<>((CollectionUtils.removeAll(listOne,listTwo)));assertEquals(2,differences.size());assertThat(差异).containsExactly("Tom","John");6.处理重复值现在让我们看看什么时候两个列表包含重复值的差异。为此,我们需要将第一个列表中的重复元素删除到它们在第二个列表中包含的确切次数。在我们的示例中,“Jack”值在第一个列表中出现两次,在第二个列表中仅出现一次:Listdifferences=newArrayList<>(listOne);listTwo.forEach(differences::remove);assertThat(differences).containsExactly("Tom","John","Jack");我们还可以使用ApacheCommonsCollections中的subtract方法:Listdifferences=newArrayList<>(CollectionUtils.subtract(listOne,listTwo));assertEquals(3,differences.size());assertThat(differences).containsExactly("汤姆","约翰","杰克");7.结论在本文中,我们探索了几种查找列表差异的方法。在这些示例中,我们介绍了一个基本的Java解决方案、一个使用StreamsAPI的解决方案以及GoogleGuava和ApacheCommonsCollections等第三方库,并学习了如何处理重复值。本文转载自微信公众号《锅外大哥》,可通过以下二维码关注。转载本文请联系锅外老板公众号。