我有m×n矩阵,我需要更改列数(增加或减少)。我有以下代码,但它不起作用。
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;
}
}
答案 0 :(得分:1)
问题是您要更改行数而不是resizeArray
方法中的列数。您可以通过在主方法A.length
的末尾打印来判断,它等于2D数组中的行数。这条线
int oldSize = java.lang.reflect.Array.getLength(oldArray);
与将oldSize
设置为A.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]
。使用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;
}
答案 1 :(得分:0)
您无法将其分配给阵列A,因为它的尺寸已经定义。您可以声明另一个未启动的数组。
另外我认为你在resizeArray方法中使它太复杂了。除非您想学习反射,否则您只需创建一个具有新大小的新数组,然后复制并返回;