检查列表 A 中存在于列表 B 中的元素数 java

check number of elements in list A present in list B java

我有两个列表(数组列表),我想知道检查列表 B 中存在的列表 A 的元素数量的有效方法。

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

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

我可以循环检查,但我正在寻找一种可以使用 java 1.8

的有效且最快的方法

感谢您的帮助。

您需要做的只是找到设置的交集的大小。您可以从 listB 创建一个集合。然后遍历 listA 中的每个元素并检查它是否包含在集合中。对于基于散列的集合,集合包含花费 O(1) 时间。因此,这需要 O(n) 时间和 space 复杂度。这是它的样子。

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();

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

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

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

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

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

请注意,此方法假定列表中没有重复项,但如果是这种情况,您只需从手头的列表中创建两个集合并应用相同的方法即可。

使用 Java 8 的 Stream 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