2017-12-25 7 views
-2

Javaで2次元配列の最大値を探しようとしています。インデックスがJavaで範囲外です

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); 

} 

} 

ただし、インデックスから範囲外のエラーが発生します。なぜだろう?

ありがとうございます!

答えて

1

異なるネストされた配列を反復処理していますが、常にi < [0]を見ています。

for(int j=0; j<(a[i].length);j++) 

とあなたの例では第二の内側のアレイは、最初よりも小さい:

あなたの内側のループではなく、このように宣言する必要があります。最初の長さで2番目のものを反復するとき、それは間違いなく境界から外れます。

0

基本的には配列の配列です。

あなたの2次元配列には長さの異なる2つの配列が効果的に含まれています。それは

j<(a[i].length) 

各配列要素の長さを使用しなければならない場合

あなたの第二のループは

j<(a[0].length) 

の状態を有しています。

0

a[0].lengthに対して内側のループをテストしています。これは、ギザギザの多次元配列の最初の配列の長さです(2番目の長さよりも長くなります)。代わりにa[i].lengthを使用し、を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); 
} 

とは、Javaの8+では、我々はそれを有意に短縮するラムダを使用することができます。同様に、

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); 
} 
関連する問題