java

时间:2017-12-25 17:43:26

标签: java

我试图在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);

}

}

但是我的索引超出了范围错误。我想知道为什么?

谢谢!

3 个答案:

答案 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()