2017-04-06 2 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을 알 수 있습니다.이 값은 2D 배열의 행 수와 같습니다. 라인

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

A.lengtholdSize를 설정하는 것과 동일하다. 그래서 우리는 모두 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; 
} 
0

차원이 이미 정의되어 있으므로 배열 A에 할당 할 수 없습니다. 시작되지 않은 다른 배열을 선언 할 수 있습니다.

또한 나는 resizeArray 메소드에서 너무 복잡하다고 생각합니다. 리플렉션을 배우고 싶지 않으면 새로운 크기로 새로운 배열을 만든 다음 복사하여 반환하면됩니다.

관련 문제