如何高效移除RetailerConversionDtoList中无对应RetailerDto的元素?
优化实现方案
要高效完成这个需求,核心思路是先把目标集合的关键值提取到哈希集合中,利用哈希集合O(1)的查询性能,避免双重遍历带来的高时间复杂度。具体实现步骤如下:
1. 提取有效编码到HashSet
先从retailerDtoList中提取所有code值存入HashSet,后续的存在性检查会非常高效:
// 提取所有有效的retailer code到HashSet,同时过滤空值避免干扰 Set<String> validRetailerCodes = retailerDtoList.stream() .map(RetailerDto::getCode) .filter(Objects::nonNull) .collect(Collectors.toCollection(HashSet::new));
2. 过滤目标列表
有两种常用的过滤方式,可根据场景选择:
方式一:用Stream生成新列表(推荐,无并发修改问题)
如果允许生成新列表,这种写法最简洁安全:
List<RetailerExcelConversionDto> filteredList = retailerConversionDtoList.stream() .filter(dto -> validRetailerCodes.contains(dto.getRetailerCode())) .collect(Collectors.toList());
方式二:原地修改原列表(用迭代器规避并发修改异常)
如果必须在原列表上直接修改,不能用普通for-each循环,需要借助迭代器:
Iterator<RetailerExcelConversionDto> iterator = retailerConversionDtoList.iterator(); while (iterator.hasNext()) { RetailerExcelConversionDto dto = iterator.next(); if (!validRetailerCodes.contains(dto.getRetailerCode())) { iterator.remove(); } }
性能说明
- 时间复杂度:O(n + m),其中n是
retailerDtoList的长度,m是retailerConversionDtoList的长度,远优于双重遍历的O(n*m)。 - 空间复杂度:O(n),用于存储有效编码的HashSet,属于典型的用空间换时间的优化方案。
注意:如果code或retailerCode可能为空,要保留空值过滤的逻辑,避免触发空指针异常。
内容的提问来源于stack exchange,提问作者kamrul Islam Tushar
相关产品推荐
相关产品推荐

