2017-04-06 78 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来判断,它等于二维数组中的行数。行

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

相同设置oldSizeA.length。所以我们都同意oldSize是输入数组中的行数。然后行

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

副本元素oldArray[0]oldArray[1]oldArray[2],... oldArray[preserveLength - 1]newArray[0]newArray[1]newArray[2],... newArray[preserveLength - 1]分别。对于二维数组,您基本上是复制旧数组的行并将其放入新数组中。

一种可能的解决方案可以是通过将元件从旧阵列到新的阵列以使尺寸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方法太多复杂。除非你想学习反射,否则你可以创建一个新的大小的数组然后复制并返回;