我试图在java中找到2D数组的最大值。
import java.util.*;
public class ikiBoyutlu {
public static void ikiBoyut(int[][]a){
int eb= a[0][0];
for(int i=0;i<a.length;i++){
for(int j=0; j<(a[0].length);j++){
if(a[i][j]>eb){
eb=a[i][j];
}
}
}
System.out.println("The max value of array= "+ eb);
}
public static void main(String[] args){
int a[][] ={{2,5,7,0,-6,28,43},{-96,45,3,21}};
ikiBoyut(a);
}
}
但是我的索引超出了范围错误。我想知道为什么?
谢谢!
答案 0 :(得分:1)
你正在迭代不同的嵌套数组,同时总是在观察i&lt;一个[0]。
您的内部循环应该以这种方式声明,而不是:
for(int j=0; j<(a[i].length);j++)
并且在您的示例中,第二个内部数组小于第一个内部数组。所以当用第一个长度迭代第二个时,它肯定会超出界限......
答案 1 :(得分:0)
你有一个二维数组,它基本上是一个数组数组。
你的两个二维数组实际上包含两个不同长度的数组。
你的第二个循环具有
的条件j<(a[0].length)
什么时候应该
j<(a[i].length)
使用每个数组元素的长度。
答案 2 :(得分:0)
您正在针对a[0].length
测试内部循环,a[i].length
是锯齿状多维数组中第一个数组的长度(并且长于第二个数组)。相反,请使用eb
- 您也可以使用Integer.MIN_VALUE
初始化Math.max(int, int)
并使用public static void ikiBoyut(int[][] a) {
int eb = Integer.MIN_VALUE;
for (int i = 0; i < a.length; i++) {
for (int j = 0; j < a[i].length; j++) {
eb = Math.max(eb, a[i][j]);
}
}
System.out.println("The max value of array= " + eb);
}
而不是编写自己的测试代码。像,
for-each
这也是您可以使用public static void ikiBoyut(int[][] a) {
int eb = Integer.MIN_VALUE;
for (int[] arr : a) {
for (int i : arr) {
eb = Math.max(eb, i);
}
}
System.out.println("The max value of array= " + eb);
}
循环消除错误的地方。例如,
public static void ikiBoyut(int[][] a) {
int eb = Stream.of(a).flatMapToInt(IntStream::of).max().orElse(Integer.MIN_VALUE);
System.out.println("The max value of array= " + eb);
}
而且,在Java 8+中,我们可以使用 lambdas 来显着缩短它。像,
scanner.nextInt()