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

Java二维数组提取前5大数值遇阻,求技术解决方案

解决二维数组提取前N大数值的问题

先修复你当前第二大值的问题

你的代码存在两个核心错误:

  • 遍历范围错误:二维数组是4×5结构,但内层循环条件写成了j < arrSize.length(即j<4),导致每行最后一个元素(索引4)从未被遍历,直接少处理了5个数据。正确的内层循环条件应该是j < arrSize[i].length,确保遍历每行的所有元素。
  • 第二大值逻辑错误:你当前的代码没有正确更新largeNumTwo,反而错误修改了原数组元素。正确的逻辑应该是:
    1. 当遇到比max更大的数时,先把原来的max赋值给largeNumTwo(因为原来的最大值现在变成了第二大候选),再更新max为当前数;
    2. 当遇到比max小但比largeNumTwo大的数时,直接更新largeNumTwo为当前数;
    3. 还要考虑数组中有重复最大值的情况,避免误把重复的最大值当成第二大值。

修正后的完整代码:

package secondAssignment;

import java.util.Random;

public class BiggestNumbersRectangular {

    public static void main(String[] args) {

        Random rand = new Random();
        int[][] arrSize = new int[4][5];
        
        // 生成并打印二维数组
        for (int i = 0; i < arrSize.length; i++) {
            for (int j = 0; j < arrSize[i].length; j++) { // 修正内层循环条件
                arrSize[i][j] = rand.nextInt(89) + 10;
                System.out.print(arrSize[i][j] + " ");
            }
            System.out.println();
        }
        
        int max = arrSize[0][0];
        int largeNumTwo = Integer.MIN_VALUE; // 初始化为最小整数,避免原数组第一个值干扰
        
        for (int i = 0; i < arrSize.length; i++) {
            for (int j = 0; j < arrSize[i].length; j++) {
                int current = arrSize[i][j];
                if (current > max) {
                    // 原来的max变成第二大候选
                    largeNumTwo = max;
                    max = current;
                } else if (current > largeNumTwo && current != max) {
                    // 比第二大值大但不等于max的情况
                    largeNumTwo = current;
                }
            }
        }
        
        System.out.println("Highest Number: " + max);
        System.out.println("Second Highest Number: " + largeNumTwo);
    }
}

扩展:提取前5大数值的通用方法

如果要提取前5大的数值,有两种常用实现方式:

方法1:转一维数组后排序

这种方式直观易懂,适合小数据量场景:

package secondAssignment;

import java.util.Arrays;
import java.util.Random;

public class BiggestNumbersRectangular {

    public static void main(String[] args) {

        Random rand = new Random();
        int[][] arrSize = new int[4][5];
        int[] flatArray = new int[4 * 5];
        int index = 0;
        
        // 生成二维数组并同时转成一维数组
        for (int i = 0; i < arrSize.length; i++) {
            for (int j = 0; j < arrSize[i].length; j++) {
                arrSize[i][j] = rand.nextInt(89) + 10;
                flatArray[index++] = arrSize[i][j];
                System.out.print(arrSize[i][j] + " ");
            }
            System.out.println();
        }
        
        // 排序一维数组
        Arrays.sort(flatArray);
        
        // 输出前5大的数(排序后数组的最后5个元素)
        System.out.println("前5大的数值:");
        for (int k = flatArray.length - 1; k >= flatArray.length - 5; k--) {
            System.out.print(flatArray[k] + " ");
        }
    }
}

方法2:维护大小为5的数组跟踪前5大值

这种方式不需要排序整个数组,效率更高,适合大数据量场景:

package secondAssignment;

import java.util.Random;

public class BiggestNumbersRectangular {

    public static void main(String[] args) {

        Random rand = new Random();
        int[][] arrSize = new int[4][5];
        
        // 生成并打印二维数组
        for (int i = 0; i < arrSize.length; i++) {
            for (int j = 0; j < arrSize[i].length; j++) {
                arrSize[i][j] = rand.nextInt(89) + 10;
                System.out.print(arrSize[i][j] + " ");
            }
            System.out.println();
        }
        
        // 初始化前5大数组,用最小整数填充
        int[] top5 = new int[5];
        for (int i = 0; i < top5.length; i++) {
            top5[i] = Integer.MIN_VALUE;
        }
        
        for (int i = 0; i < arrSize.length; i++) {
            for (int j = 0; j < arrSize[i].length; j++) {
                int current = arrSize[i][j];
                // 找到top5中最小的元素的索引
                int minIndex = 0;
                for (int k = 1; k < top5.length; k++) {
                    if (top5[k] < top5[minIndex]) {
                        minIndex = k;
                    }
                }
                // 如果当前元素比top5中的最小值大,就替换它
                if (current > top5[minIndex]) {
                    top5[minIndex] = current;
                }
            }
        }
        
        // 排序top5数组以便从大到小输出
        for (int i = 0; i < top5.length - 1; i++) {
            for (int j = i + 1; j < top5.length; j++) {
                if (top5[i] < top5[j]) {
                    int temp = top5[i];
                    top5[i] = top5[j];
                    top5[j] = temp;
                }
            }
        }
        
        System.out.println("前5大的数值:");
        for (int num : top5) {
            System.out.print(num + " ");
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 22:10:44