Java中Set<List<String>>按规则逐元素比对并统计出现次数的实现问题
实现方案
前置说明
- 由于原始结构
Set<List<String>>本身是无序集合,无法明确「排在当前List之后的List」的顺序,因此第一步需要先将Set转为有序的List<List<String>>结构,你可以根据业务需要指定排序规则,示例中我们默认按Set的迭代顺序转为有序列表。
步骤1:剔除每个List的首个元素
你可以通过List.subList()方法直接截取首个元素之后的部分,无需额外自定义提取函数,同时保留每个子列表的顺序上下文:
// 原始数据 Set<List<String>> originalSet = new HashSet<>(); originalSet.add(Arrays.asList("A", "B", "C", "D", "E")); originalSet.add(Arrays.asList("A", "B", "C", "D", "F")); originalSet.add(Arrays.asList("G", "K", "P", "C")); originalSet.add(Arrays.asList("Z", "C", "R", "D")); originalSet.add(Arrays.asList("F", "Z", "U")); // 预处理:剔除每个List首元素,同时转为有序列表 List<List<String>> processedList = originalSet.stream() .map(list -> list.size() > 1 ? list.subList(1, list.size()) : Collections.emptyList()) .collect(Collectors.toList());
处理后的processedList就对应你给出的示例结果,且保留了原集合的顺序关系。
步骤2:按规则统计重叠次数
我们使用Map<Integer, Integer>存储最终统计结果,key为重叠次数,value为对应次数的计数:
Map<Integer, Integer> countMap = new HashMap<>(); int size = processedList.size(); // 遍历每个List(索引为i) for (int i = 0; i < size; i++) { List<String> currentList = processedList.get(i); // 遍历当前List的每个元素 for (String element : currentList) { int appearTimes = 0; // 遍历排在当前List之后的所有List(索引j > i) for (int j = i + 1; j < size; j++) { List<String> laterList = processedList.get(j); // 统计当前元素是否在后续List中出现 if (laterList.contains(element)) { appearTimes++; } } // 对应重叠次数的计数+1,不需要统计出现0次的场景可以加if判断 if (appearTimes > 0) { countMap.put(appearTimes, countMap.getOrDefault(appearTimes, 0) + 1); } } }
如果你需要统计的是元素在后续所有List中的总出现次数(即同一个后续List里出现多次就计数多次),只需要把内层判断替换为
appearTimes += Collections.frequency(laterList, element)即可。
结果验证
以你给出的示例数据为例,最终统计结果可以直接通过countMap获取,比如你提到的第一个List的元素B,在后续4个List中仅第2个List出现,重叠次数为1,因此countMap中key为1的计数会加1,符合你的需求。
内容的提问来源于stack exchange,提问作者kaganndemirr
相关产品推荐
相关产品推荐

