查找两个嵌套列表中常见元素的计数



比较Java 中字符串列表对象1列表中的每个元素与另一个对象对象2

我有一个初始化为object1的字符串列表列表,如下所述:

List<List<String>> object1 = Arrays.asList(Arrays.asList("A", "B", "C"),
Arrays.asList("D", "E", "F"), 
Arrays.asList("G", "H", "I"));

我有另一个初始化为object2的字符串列表列表,如下所述:

List<List<String>> object2 = Arrays.asList(Arrays.asList("A", "B", "C"),
Arrays.asList("D", "E", "F"), 
Arrays.asList("G", "H", "J"));

如何按相同的顺序逐个比较两个对象之间的每个元素

需要初始化一个计数器变量来跟踪两个对象之间存在的公共元素的数量。

预期结果:8

您可以生成一个Map,表示两个列表中每个元素的出现次数

然后,通过在每对中选择最小值相关的数值相加。

如果你对流很满意,这个逻辑可以这样实现:

public static Map<String, Long> getFrequencies(List<List<String>> list) {

return list.stream()
.flatMap(List::stream)
.collect(Collectors.groupingBy(
Function.identity(),
Collectors.counting()
));
}
public static long countCommonValues(Map<String, Long> map1, Map<String, Long> map2) {

return map1.entrySet().stream()
.filter(entry -> map2.containsKey(entry.getKey()))
.mapToLong(entry -> Math.min(entry.getValue(), map2.get(entry.getKey())))
.sum();
}

main()

public static void main(String[] args) {
List<List<String>> list1 = List.of(
List.of("A", "B", "A"),
List.of("D", "E", "H"),
List.of("G", "H", "I"));

List<List<String>> list2 = List.of(
List.of("A", "B", "C", "D"),
List.of("D", "E", "F", "A"),
List.of("G", "H", "J", "H"));
System.out.println(countCommonValues(getFrequencies(list1), getFrequencies(list2)));
}

输出:

8   // "A", "A", "B", "D", "E", "G", "H", "H"

联机演示链接


如果顺序很重要,并且嵌套列表不能保证大小相同,我们可以压平两个列表,然后比较相应索引处的元素。

public static <T> long countCommonValues(List<List<T>> list1, List<List<T>> list2) {

List<T> flattened1 = flatten(list1);
List<T> flattened2 = flatten(list2);

return IntStream.range(0, Math.min(flattened1.size(), flattened2.size()))
.filter(i -> flattened1.get(i).equals(flattened2.get(i)))
.count();
}
public static <T> List<T> flatten(List<List<T>> list) {
return list.stream()
.flatMap(List::stream)
.toList();
}

要获得所需的输出,最简单的方法是使用2个嵌套循环来迭代Lists和Sublists,并检查每个元素是否相等,使用一个简单的计数器变量来跟踪相等的元素:

int equalElements = 0;
for (int i = 0; i < object1.size() && i < object2.size(); i++) {
final List<String> subList1 = object1.get(i);
final List<String> subList2 = object2.get(i);
for(int x = 0; x < subList1.size() && x < subList2.size(); x++) {
if (Objects.equals(subList1.get(x), subList2.get(x))) {
equalElements++;
}
}
}

System.out.println(equalElements);

最新更新