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

如何获取数组中三个最大整数的索引?求Java代码修复方案

解决你的Top3分数数组问题

嘿,我看你想从scores数组里提取三个最高分数,但当前代码返回的[1,1,0]明显不对,咱们来一步步捋清楚问题出在哪,再给你修正方案:

你的代码里的核心问题:

  • 数组没真正复制:int[] copy = scores; 这行只是让copy和scores指向同一个数组,不是创建新副本。你改copy的时候原数组也会被改,这会搞乱后续的最大值查找。
  • 循环次数不够:外层循环for (int i = 1; i != 3; i++) 只跑2次(i=1和i=2),所以out的第三个位置(索引2)一直是默认的0,这就是结果里最后那个0的由来。
  • 存错了内容:你把队伍编号j存进out了,但你要的是分数啊!应该存对应的分数值,不是队伍号。
  • 数组下标错误:copy[biggest] = 0; 这里biggest是队伍号(比如1),但数组下标从0开始,得写成copy[biggest - 1]才行,不然要么改错位置,要么直接数组越界报错。

修正后的可行代码:

import java.util.Arrays; // 别忘了导入Arrays类,用copyOf的时候需要

public int getScore(int teamnumber) { // scores = [100, 25, 55, 15, 17]
    return this.scores[teamnumber - 1];
}

public int[] top3() {
    // 真正复制原数组,避免修改原数据
    int[] copy = Arrays.copyOf(scores, scores.length);
    int[] out = new int[3];
    
    // 循环3次,每次找当前最大值存入out
    for (int i = 0; i < 3; i++) {
        int maxIndex = 0; // 记录当前最大值的下标
        // 遍历副本找最大值
        for (int j = 1; j < copy.length; j++) {
            if (copy[j] > copy[maxIndex]) {
                maxIndex = j;
            }
        }
        // 把最大值放进结果数组
        out[i] = copy[maxIndex];
        // 把已经找到的最大值设为0(因为你的分数都是正数),防止重复选中
        copy[maxIndex] = 0;
    }
    
    return out; // 现在会返回 [100, 55, 25],完全符合你的需求
}

额外的优化思路:

如果你的分数可能出现负数,那把找到的最大值设为Integer.MIN_VALUE会更靠谱,而不是0。另外,也可以用排序的方式来实现,代码更简洁:

import java.util.Arrays;

public int[] top3() {
    int[] copy = Arrays.copyOf(scores, scores.length);
    Arrays.sort(copy); // 升序排序
    // 取排序后的最后三个元素(最大的三个),倒序放进结果数组
    int[] out = {copy[copy.length-1], copy[copy.length-2], copy[copy.length-3]};
    return out;
}

这样两种方式都能得到你想要的三个最高分数数组啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:20:20