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

如何在单个for循环中完成重复值统计与List值修改操作?

问题根因

你之前尝试合并循环时统计出错,核心是操作顺序错误:如果先替换列表元素再做统计,后续取到的已经是修改后的新值,自然无法正确统计原始数值的出现次数。
另外你原有代码中反复调用Collections.frequency计算频次,每次调用都会遍历一次全列表,整体时间复杂度为O(n²),列表规模越大性能损耗越严重。

合并后正确实现

public static Map<Integer, Integer> replace(List<Integer> inputList, Set<Integer> numberSet, Integer newNumber) {
    Map<Integer, Integer> map = new HashMap<>();
    for (int i = 0; i < inputList.size(); i++) {
        // 先取当前位置的原始值
        Integer oldVal = inputList.get(i);
        if (numberSet.contains(oldVal)) {
            // 先更新统计计数,不存在的key默认计数为0后+1
            map.put(oldVal, map.getOrDefault(oldVal, 0) + 1);
            // 统计完成后再替换为新值,不会影响后续遍历的原始值取值
            inputList.set(i, newNumber);
        }
    }
    return map;
}

优化点说明

  • 仅需一次遍历完成统计+替换两个操作,整体时间复杂度降为O(n)
  • 严格遵循「取原始值→统计计数→替换值」的操作顺序,彻底避免统计值覆盖错误
  • 用Map.getOrDefault累加计数,去掉了冗余的全列表频次遍历操作,性能提升明显

内容的提问来源于stack exchange,提问作者yesmen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 13:45:06