You need to enable JavaScript to run this app. Java查找ArrayList所有最大值索引并追加时输出不符合预期的问题
优惠活动
大模型
产品
解决方案
定价
更多

Java查找ArrayList所有最大值索引并追加时输出不符合预期的问题

代码存在的核心问题
  • 最关键的逻辑漏洞:遍历发现比当前记录的最高值更大的元素时,完全没有同步更新high变量的数值
    原代码中high从初始化后就一直停在列表第一个元素的值(也就是示例列表的1),哪怕已经遍历到值为2的元素,high也不会更新为2,后续所有值为1的元素都会被判定为和high相等,直接混入结果列表。
  • 两个判断是平行独立的if分支,没有做互斥处理
    当一个元素的值大于当前high时,本身不可能同时满足“等于当前high”的条件,平行判断会造成逻辑冗余,甚至在后续维护中引发重复加值的问题。
  • 错误结果的完整触发逻辑
    对照你给出的示例列表走一遍原代码流程就能复现错误:当遍历到索引2、值为2的元素时,代码虽然清空了结果列表并把2加入,但因为没更新high,high还是1;遍历到索引4、值为2的元素时,再次清空列表加入4,high依然没有更新,后续从索引5到14的元素全是1,每个都满足“等于high(1)”的判断,就被挨个加入结果,最终就出现了你看到的[4,5,6,7,8,9,10,11,12,13,14]的错误结果。
修正方案

核心做两处改动即可:

  1. 在检测到更大值的分支里,把当前遍历到的值赋值给high,同步更新最高值记录
  2. 把第二个平行的if改成else if,让两个判断互斥,避免冗余触发

修正后的完整代码:

int high = findRelevance.get(0);
ArrayList<Integer> IndicesOfHighest = new ArrayList<>();
for (int iiii = 0; iiii < findRelevance.size(); iiii++)
{
    int current = findRelevance.get(iiii);
    if (current > high)
    {
        // 遇到更大值:清空旧结果,更新最高值,记录新索引
        IndicesOfHighest.clear();
        high = current;
        IndicesOfHighest.add(iiii);
    }
    else if (current == high)
    {
        // 遇到和当前最高值相等的元素,直接记录索引
        IndicesOfHighest.add(iiii);
    }
}

运行这段修正后的代码,最终得到的结果就是你预期的[2,4]。

实际开发小提示:如果findRelevance是空列表,上面的初始化代码会触发数组越界,使用前可以加个非空判断再取初始值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.10 13:15:07