如何从list2中计算与list1的差集并忽略list2元素末尾的日期后缀?
实现方案
核心思路
- 先将
list1转为HashSet结构,将文件名查找时间复杂度从O(n)降低到O(1),大幅提升大批量数据的处理效率 - 遍历
list2的每个元素,以:::为分隔符拆分字符串,取第一段内容去除首尾空白后得到纯文件名 - 筛选出纯文件名不在
list1对应的HashSet中的元素,即为所需的差集结果
代码实现
Java 8+ 流式写法(推荐)
import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.stream.Collectors; public class DiffCalculation { public static void main(String[] args) { // 初始化示例集合 List<String> list1 = new ArrayList<>(); list1.add("1/ce/a6/5a/1cea65ab9260df8d55fb29ce0df570d4.jpg"); list1.add("1/ce/a6/5a/1cea65ab9260df8d55fb29ce0df570d3.jpg"); list1.add("1/ce/a6/5a/1cea65ab9260df8d55fb29ce0df570d6.jpg"); List<String> list2 = new ArrayList<>(); list2.add("1/ce/a6/5a/1cea65ab9260df8d55fb29ce0df570d1.jpg ::: 2021-09-17T17:07:52Z"); list2.add("1/ce/a6/5a/1cea65ab9260df8d55fb29ce0df570d2.jpg ::: 2021-09-17T17:07:52Z"); list2.add("1/ce/a6/5a/1cea65ab9260df8d55fb29ce0df570d3.jpg ::: 2021-09-17T17:07:52Z"); // list1转为Set用于快速查找 Set<String> fileNameSet = new HashSet<>(list1); // 筛选差集 List<String> diffResult = list2.stream() .filter(item -> !fileNameSet.contains(item.split(":::")[0].trim())) .collect(Collectors.toList()); // 验证输出 diffResult.forEach(System.out::println); } }
低版本Java兼容写法(Java 7及以下)
Set<String> fileNameSet = new HashSet<>(list1); List<String> diffResult = new ArrayList<>(); for (String item : list2) { String fileName = item.split(":::")[0].trim(); if (!fileNameSet.contains(fileName)) { diffResult.add(item); } }
运行结果
上述示例代码运行后,最终输出的差集内容为:
1/ce/a6/5a/1cea65ab9260df8d55fb29ce0df570d1.jpg ::: 2021-09-17T17:07:52Z 1/ce/a6/5a/1cea65ab9260df8d55fb29ce0df570d2.jpg ::: 2021-09-17T17:07:52Z
符合需求:文件名和list1重合的d3.jpg对应的条目已被剔除。
内容的提问来源于stack exchange,提问作者Steve Jobs
相关产品推荐
相关产品推荐

