检查列表A中出现在列表B中的元素数量

  • 本文关键字:列表 元素 java collections
  • 更新时间 :
  • 英文 :


我有两个列表(数组列表),我想知道有效的方法来检查列表A中出现在列表b中的元素数量

List<String> listA = new ArrayList<>();
List<String> listB = new ArrayList<>();

我想知道在listA中有多少个元素listB

我可以循环和检查,但我正在寻找一个有效的和最快的方式,我可以使用java 1.8

谢谢你的帮助。

另一种不需要循环和创建第三个列表的简单方法如下:

var listA = new ArrayList<>(list1);
var listB = new ArrayList<>(list2);
listB.retainAll(listA);
System.out.println(listB);

请注意,此方法假设列表中没有重复的列表,但如果是这种情况,您可以简单地从手头的列表中创建两组并应用相同的方法。

您可以创建包含与listA相同内容的第三个列表,然后从新列表中删除listB,然后您可以区分listA中有多少元素存在于listB中,如下所示:

List<String> listC = new ArrayList<>(listA);
listC.removeAll(listB);
int elementsPresentInListB = listA.size() - listC.size();

使用Java 8的流API,您可以使用以下命令来获得两个列表的交集:

Set<String> intersection = listA.stream()   // creates stream
.distinct() // filters out any duplicates
.filter(listB::contains) // filters the intersection
.collect(Collectors.toSet()); // reduces to set
int amount = intersection.size(); // your amount of duplicate elements

你所需要做的就是找到集合交点的大小。可以从listB创建一个集合。然后遍历listA中的每个元素并检查它是否包含在集合中。对于基于哈希的集合,该集合包含的时间为O(1)。这需要0 (n)的时间和空间复杂度。这是它的样子。

final Set<String> setB = new HashSet<>(listB);
int c = 0;
for (String string : listA)
if (setB.contains(string))
c = c + 1;

更简洁的解决方案是:

setB.retainAll(listA);
c = setB.size();

这个操作有效地修改了这个集合,使它的值是两个集合的交集。

最新更新