2017-04-06 16 views
-1

私はm×nの行列を持ち、列の数(増減)を変更する必要があります。私は次のコードを持っていますが、動作しません。Javaで行列のサイズを増減する方法は?

public class Resize { 

    public static int [][] A = new int [2][2]; 
    public static int i, j; 

    public static void main(String[] args) { 
     A = (int[][])resizeArray(A,4); 
     for(i = 0 ; i < 2 ; i++){ 
     for(j = 0 ; j < 4 ; j++){ 
      A[i][j] = j+i; 
      System.out.print(A[i][j]+" "); 
     } 
     System.out.println(""); 
    } 
} 
// resize arr from dimension n = 20 to dimension n = 14 /////////////// 
private static Object resizeArray (Object oldArray, int newSize) { 
     int oldSize = java.lang.reflect.Array.getLength(oldArray); 
     Class elementType = oldArray.getClass().getComponentType(); 
     Object newArray = java.lang.reflect.Array.newInstance(elementType, newSize); 
     int preserveLength = Math.min(oldSize, newSize); 
     if (preserveLength > 0) 
      System.arraycopy(oldArray, 0, newArray, 0, preserveLength); 
     return newArray; 
    } 
} 
+1

「動作しません」は動作上の問題の説明ではありません。それ以外では、配列のサイズを変更することはできません。完全に新しい配列を作成し、それを既存の配列に代入するだけで、実際には最初の配列を破棄することができます。 – GhostCat

答えて

1

問題は、resizeArrayメソッドの列数ではなく、行数を変更していることです。メインメソッドの最後には、A.lengthという2次元配列の行数に相当する文字が表示されます。ライン

int oldSize = java.lang.reflect.Array.getLength(oldArray); 

A.lengtholdSizeを設定することと同じです。したがって、入力された配列の行数はoldSizeになります。そして、ライン

System.arraycopy(oldArray, 0, newArray, 0, preserveLength); 

コピー要素oldArray[0]oldArray[1]oldArray[2]、... newArray[0]からoldArray[preserveLength - 1]newArray[1]newArray[2]、... newArray[preserveLength - 1]それぞれ。 2D配列では、基本的に古い配列の行をコピーして新しい配列に入れます。

可能な解決策は、サイズがMath.min(oldArray[0].length, newLength)の新しい配列を作成し、古いアレイの要素を新しい配列に入れて新しい配列をループすることです。

private static int[][] resizeArray (int[][] oldArray, int newSize) { 
    int oldSize = oldArray[0].length; //number of columns 
    int preserveLength = Math.min(oldSize, newSize); 
    int[][] newArray = new int[oldArray.length][newSize]; 
    for(int i = 0; i < oldArray.length; i++) { 
     for(int j = 0; j < preserveLength; j++) { 
      newArray[i][j] = oldArray[i][j]; 
     } 
    } 
    return newArray; 
} 
0

次元が既に定義されているため、配列Aに割り当てることはできません。開始されていない別の配列を宣言できます。

また、resizeArrayメソッドでは複雑すぎると思います。反射を学びたいのでなければ、新しいサイズの新しい配列を作成してコピーして戻すことができます。

関連する問題