Java二维数组提取前5大数值遇阻,求技术解决方案
解决二维数组提取前N大数值的问题
先修复你当前第二大值的问题
你的代码存在两个核心错误:
- 遍历范围错误:二维数组是
4×5结构,但内层循环条件写成了j < arrSize.length(即j<4),导致每行最后一个元素(索引4)从未被遍历,直接少处理了5个数据。正确的内层循环条件应该是j < arrSize[i].length,确保遍历每行的所有元素。 - 第二大值逻辑错误:你当前的代码没有正确更新
largeNumTwo,反而错误修改了原数组元素。正确的逻辑应该是:- 当遇到比
max更大的数时,先把原来的max赋值给largeNumTwo(因为原来的最大值现在变成了第二大候选),再更新max为当前数; - 当遇到比
max小但比largeNumTwo大的数时,直接更新largeNumTwo为当前数; - 还要考虑数组中有重复最大值的情况,避免误把重复的最大值当成第二大值。
- 当遇到比
修正后的完整代码:
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
相关产品推荐
相关产品推荐

