如何在单个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
相关产品推荐
相关产品推荐

