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]的错误结果。
修正方案
核心做两处改动即可:
- 在检测到更大值的分支里,把当前遍历到的值赋值给
high,同步更新最高值记录 - 把第二个平行的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
相关产品推荐
相关产品推荐

