You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何高效移除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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 02:40:26