-1

これは私の最初のスタックオーバーフローポストであり、私はかなりjavaに新しくなっているので、私は最初にあなたが私に与えるフィードバックの一部を理解していないかもしれません。ArrayIndexOutOfBoundsException 2次元配列/行列の行列式を見つけるときに

このプログラムでは、ユーザーが決定したサイズで行列の行列式を再帰的に見つけることになっています。私はそうすると、しかし、私はこのエラーを取得:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1

at Determinant.Copy<Determinant.java:55> 
at Determinant.det<Determinant.java:31> 
at Determinant.main<Determinant.java:15> 

私は、このエラーが何を意味するかを理解し、それが起こっている理由を私は理解していません。ここで

は、私が使用しているクラスである(printmatrixとmainメソッドの両方が先生によって書かれた、私はコピーとDETのメソッドを完了する必要がありました):エラーがelseステートメント内で発生

import javax.swing.JOptionPane; 

public class Determinant 
{ 
    public static void main(String args[]) 
    { 
    String sizeStr = JOptionPane.showInputDialog("What size?"); 
    int size = Integer.parseInt(sizeStr); 
    int[][] matrix = new int[size][size]; 
    for(int i=0; i<size; i++) 
     for(int j=0; j<size; j++) 
      matrix[i][j] = (int)(Math.random()*40)-20; 

    printArray(matrix); 
    System.out.println("\nThe determinant = "+det(matrix)); 

    } 


public static int det(int[][] A) 
{ 
    int answer = 0; 
    int place = 0; 
    int[][] temp; 
    int[][] temp1; 
    if(A.length==1){ 
     return(A[0][0]); 
    } 
    for(int i = 0; i<A.length; i++){ 
     temp = new int[A.length-1][A[0].length-1]; 
     temp1 = Copy(temp, i); 
     if(i%2==0){ 
      place = 1; 
     } 
     else{ 
      place = -1; 
     } 
     answer = answer + place * A[0][i] * det(temp1); 
    } 
    return answer; 
} 



public static int[][] Copy(int[][] B, int i) 
{ 
    int[][] C = new int[B.length-1][B.length-1]; 

    for(int j = 1; j<B.length; j++){ 
     for(int k = 0; k<B[0].length; k++){ 
      if(k>i){ 
       C[j-1][k-1]=B[j][k]; 
      } 
      else{ 
       C[j-1][k]=B[j][k]; 
      } 
     } 
    } 
    return C; 
} 


public static void printArray(int[][] A) 
{ 
    for(int i=0; i<A.length; i++) 
    { 
     for(int j=0; j<A.length; j++) 
     { 
      int num = A[i][j]; 
      if(num<-9) 
       System.out.print(" "); 
      else if(num<0||num>9) 
       System.out.print(" "); 
      else 
       System.out.print(" "); 
      System.out.print(A[i][j]); 
     } 
     System.out.println(); 
    } 
} 


} 

コピーし、temp1 = Copy(temp, i)

jかk = 1のように混乱していますが、配列の位置ではないはずですか?私は何が欠けていますか?

+0

http://stackoverflow.com/questions/5554734/what-c​​auses-a-java-lang-arrayindexoutofboundsexception-and-how-do-i-prevent-it – Tunaki

+0

最初の行のコピーでは、新しい配列を1つの要素にしました(単に唯一の問題ではない) –

+1

2次元配列 'B'をコピーしようとしていると思いますが、' C'の境界線を等価的に設定すると、 'line [int [] [] C = new int [B.length-1] [B.length-1]; 'int [] [] C = new int [B.length] [B [0] .length];' –

答えて

0

メソッドコピーのC配列のサイズは、B配列と同じである必要があります。 理由:B配列をC配列にコピーしていますが、同じサイズである必要があります。 次のことを試してみてください。

import javax.swing.JOptionPane; 

public class Determinant 
{ 
    public static void main(String args[]) 
    { 
    String sizeStr = JOptionPane.showInputDialog("What size?"); 
    int size = Integer.parseInt(sizeStr); 
    int[][] matrix = new int[size][size]; 

    for(int i=0; i<size; i++) { 
     for(int j=0; j<size; j++) { 
      matrix[i][j] = (int) (Math.random() * 40) - 20; 
     } 
    } 

    printArray(matrix); 
    System.out.println("\nThe determinant = "+det(matrix)); 

    } 


public static int det(int[][] A) 
{ 
    int answer = 0; 
    int place = 0; 
    int[][] temp; 
    int[][] temp1; 
    if(A.length==1){ 
     return(A[0][0]); 
    } 
    for(int i = 0; i<A.length; i++){ 
     temp = new int[A.length-1][A[0].length-1]; 
     temp1 = Copy(temp, i); 
     if(i%2==0){ 
      place = 1; 
     } 
     else{ 
      place = -1; 
     } 
     answer = answer + place * A[0][i] * det(temp1); 
    } 
    return answer; 
    } 



public static int[][] Copy(int[][] B, int i) 
{ 
    //The C array size should be same as B 
    int[][] C = new int[B.length][B[0].length]; 

    for(int j = 1; j<B.length; j++){ 
     for(int k = 0; k<B[0].length; k++){ 
      if(k>i){ 
       C[j-1][k-1]=B[j][k]; 
      } 
      else{ 
       C[j-1][k]=B[j][k]; 
      } 
     } 
    } 
    return C; 
} 


public static void printArray(int[][] A) 
{ 
    for(int i=0; i<A.length; i++) 
    { 
     for(int j=0; j<A.length; j++) 
     { 
      int num = A[i][j]; 
      if(num<-9) 
       System.out.print(" "); 
      else if(num<0||num>9) 
       System.out.print(" "); 
      else 
       System.out.print(" "); 
      System.out.print(A[i][j]); 
     } 
     System.out.println(); 
    } 
} 

}

希望、これは説明して、お楽しみください!

+1

'B [0] .length];' これは、 'int [] [] [C] = new int [B.length];'でなければなりません。 () 'メソッドを呼び出します。 –

+0

@MadMatts、それを指摘してくれてありがとう。プログラムは "size"という名前の1つの入力を受け入れ、 'new int [size] [size]'を実行するので、行列が正方形であるように見えます。私は非正則行列をサポートするので、ポストを編集した人は少なくありません。 – MSameer

+0

うん、それはうまくいくようだ。フィードバックありがとうございます! – rospendan

0

あなたはこの方法でコピー機能で、あなたの行列を宣言する必要があります。

int[][] C = new int[B.length][B[0].length]; 

は、そうでなければ、行と列の行列をなし宣言しています。 0から使い始めるということは、1行を少ないもので宣言しなければならないという意味ではありません!

関連する問題