2013-09-05 7 views
1
[[-6, 3, 9], [-7, 2, 9], [-3, 2, 5], ... , [3, 4, 1]] 

사용중인 배열은 위와 같은 구조입니다.Java에서 배열의 부분 복사본

내 목표는 이전에 결정된 특정 위치를 기준으로이 배열을 나누는 것입니다.

나는 Arrays.copyOf, Arrays.copyOfRangeSystem.arraycopy을 시도했으나 성공을 거두지 못했습니다. 그래서 나는 이것을 위해 내 자신의 방법을 썼습니다. 그것은 또한 작동하지 않았다.

partitionResult

arrayOfVals

arrayOfVals 같은 구조 유형 int의 인스턴스 (변수) 배열 단지 일부만을 복사 내 의도에도 불구하고 전체 partitionResult 배열로 초기화 될 것입니다. 테스트 한 결과 (System.out.println (partitionResult[begin+i][j])) 원하는 값이 인쇄됩니다.

private int[][] copyArray(int begin, int end) 
    { 
     int SUBARRAY_SIZE = 2; 
     // below the '+1' is due to zero-indexing 
     int[][] arrayOfVals = new int[end-begin+1][SUBARRAY_SIZE+1]; 
     end -= begin; 

     for (int i = 0; i <= end; i++) { 
      for (int j = 0; j <= SUBARRAY_SIZE; j++) { 
       arrayOfVals[begin][j] = partitionResult[begin+i][j]; 
      } 
     } 
     return arrayOfVals; 
    } 

원하는대로 다음 작업을 수행 할 수없는 이유는 무엇입니까?

private void foo(int begin) 
{ 
    int[][] arrayOne = copyArray(0, begin); 
    int[][] arrayTwo = copyArray(begin+1, partitionResult.length -1); 
    ... 

} 

편집 :

[[-6, 3, 9], [-7, 2, 9], [-3, 2, 5], [3, 4, 1], [0, 5, 5], [2, 3, 1], [3, 4, 1]] 

이 내 시험 배열입니다. 정의 된 위치 begin에서 copyArray 메서드를 사용하여이 배열을 분할하고 싶습니다.

복사하고자하는 값을 인쇄 할 때 partitionResult[begin+i][j] 일 때 결과는 그대로 유지됩니다. 그러나, 최종 arrayOfVals 표시 - 출력 내가 무엇을 인쇄되지 않습니다, 전체 partitionResult 배열입니다.

나는 [[-6, 3, 9], [-7, 2, 9], [-3, 2, 5]]

arrayTwo[[3, 4, 1], [0, 5, 5], [2, 3, 1], [3, 4, 1]]

Edit2가 동일하게 동일하게 arrayOne 원하는 : 문제 아니었다 방법 copyArray으로하지만, 다른 방법으로. 내가 쓴 toString 메서드는 전달 된 배열이 아닌 partitionResult 인스턴스 변수에서 사용하는 값을 표시하는 것이므로 아무 것도 복사되지 않는 것처럼 보입니다. 그 실수는 분명 나에게 분명했다. 나는 그 충고에 크게 감사한다.

@Andrea에서 하나의 작은 버그가 발견되었습니다. 새로 생성 된 어레이는 0의 값을 삽입하기 시작하기 때문에

+0

을 자신의 방법은 당신이 개념적인 문제를 가지고 추측에는 요 작동하지 않는 경우 다음과 같이 1]]

우리는 설정 귀하의 예제 데이터를 나타낼 수 있습니다. –

+1

예상되는 출력을 가진 샘플 입력이 있습니까? 내가 해결하려고하는 문제를 잘 모르겠다. –

+0

질문을 업데이트했습니다. 감사합니다. 만약 내가 그것을 정확하게 이해한다면, 당신은 배열의 일부분의 사본을 원하는 것처럼 보일뿐입니다. 그렇게 간단해야합니다. 요청 된 요소 범위를 잡고 결과에 넣기 전에 복제하십시오. –

답변

1

이 충분히 간단해야, 당신은 단지 자신을 위해 열심히하는거야 end을 변형하여 루프의 진행을 이해하기 어렵게 만듭니다. beginend 사이의 값을 복사하지만 각 하위 배열을 복제해야합니다. (클로닝 효과적으로 내부 루프를 대체합니다.) foo(2)를 호출 할 때

private int[][] copyArray(int begin, int end) { 
    // Calculate the size of the output 
    // below the '+1' is due to zero-indexing 
    int size = end - begin + 1; 
    int[][] arrayOfVals = new int[size][]; 
    for (int i = 0; i < size; i++) { 
     // Clone each subarray to make sure changes to the copy 
     // don't affect the internal array 
     // (A shallow .clone() suffices for integer arrays) 
     arrayOfVals[i] = partitionResult[begin + i].clone(); 
    } 
    return arrayOfVals; 
} 

이 샘플 입력을 예상 출력을 제공합니다.

1

오류가

arrayOfVals[i][j] = partitionResult[begin+i][j]; 

arrayOfVals[begin][j] = partitionResult[begin+i][j]; 

변화 안에 있어야한다.fromArray는 입력 배열은 인덱스는 입력 배열을 헤어지고 싶어하는 인덱스 인 경우

+0

이 시도했지만 올바른 결과를 생성하지 않습니다. 예, 이것은 현재 begin = 0이지만 arrayOfVals가 여전히 복사하려는 값이 아닌 모든 값을 가정하기 때문에 실현하지 못한 오류 일 수 있습니다. –

0

, 당신이 할 수 있습니다 :

System.arraycopy(fromArray, 0, arrayOne, 0, index); 
    System.arraycopy(fromArray, index+1, arrayTwo, 0, fromArray.length-index); 
0

2 차원 배열을 만들 때 가지고있는 것은 배열의 배열입니다.

[0,0] [1,0] [2,0] ... [n,0] 
[0,1] [1,1] [2,1] ... [n,1] 
[0,2] [1,2] [2,2] ... [n,2] 

[-3, 3, 9], [-2, 2, 10], [-2, 2, 5, ..., [3, 4 :이 같은 문제를 봐

[-6] [-7] [-3] ... [ 3] 
[ 3] [ 2] [ 2] ... [ 4] 
[ 9] [ 9] [ 5] ... [ 1]