2013-05-13 6 views
-3

1-D 64 요소 배열의 반바지를 뒤집을 필요가 있습니다 (더 쉽다면 int로 전환 할 수 있지만 동일한 프로세스를 가정합니다). 어느 쪽이든을 위해) 자바에 그것의 머리에 일할 것이다. 나는 실제 문제가 체스 판 위에 있기 때문에 여기를 이해의 용이성을 위해 정사각형 테이블로 표현한다.Java에서 2D 배열을 나타내는 1D short/int 배열의 행을 바꿔 쓰는 방법

예를 들어 :

short[] example = new short[] 
{ 
    1, 2, 3, 
    4, 5, 6, 
    7, 8, 9 
}; 

이 될 것입니다 :

7 8 9 
4 5 6 
1 2 3 

이 내가이했다 발견 배열 (비슷한 질문에 대한 모든 회답을 반전 등 하지 동일 함을 유의하시기 바랍니다 실수, 그래서 물어 봐야!). 배열을 반대로하면 다음과 같이 표시됩니다.

중요한 정보를 놓친 경우 사과드립니다.

EDIT : 배열이 1D이고 64 개의 요소가 포함되어 있으므로 짧은 [64]이며 반대 배열은 원본과 구분됩니다. 내가 뭘 해봤 던지, 나는 단지 내 머리를 감싸기 위해 고심하고있다. 나는 배열을 반대하는 방법을 알고,하지만 난 후 무엇을하지, 난 원래 사용하여 인덱스 반전을 시도했다 :

byte index = (byte)(((byte)(position + 56)) - (byte)((byte)(position/8) * 16)); 

내가 Chessbin에서 발견 코드입니다, 그러나 이것은 잘못된 값을 반환 IndexOutOfBounds 오류를 제공합니다. 뒤늦은 시각으로 볼 때 코드가 색인을 뒤집거나 뒤집을 것인지 여부는 분명하지 않습니다. 수학은 내 강한 소송이 아니기 때문에 별도의 배열로 해결하려고했습니다.

+12

당신은 당신이 –

+3

을 시도 것을보고 싶었어 이 배열은 코드에서 어떤 모습입니까? 그것은'짧은 [] []'입니까? 아직 아무 것도 시도하지 않았습니까? 오류가 있었습니까? – thegrinner

+1

다차원 배열입니까 ? – Adarsh

답변

0

논리 2D 배열을 나타내는 실제 1D 배열이 있고 행을 교체하려고합니다. 2D 배열 인덱스를 1D 배열 인덱스에 매핑하여 부분적으로이 작업을 수행 할 수 있습니다.

height을 행 수로하고 width을 열 수로 설정하십시오.

for (int i = 0; i < height/2; ++i) { 
    int k = height - 1 - i; 
    for (int j = 0; j < width; ++j) { 
     short temp = array[i * width + j]; 
     array[i * width + j] = array[k * width + j]; 
     array[k * width + j] = temp; 
    } 
}  

나는 이것을 읽기 쉽도록 작성했습니다. 귀하 또는 컴파일러는 반복 계산 중 일부를 최적화 할 수 있습니다.

2D 배열을 사용하면 O (높이) 너비의 모든 행을 복사하는 대신 O (높이) 행의 참조를 바꿀 수 있습니다.

2

나의 제안은 다음과 같이 될 것이다 :

으로 테스트 할 수 있습니다
public class Flipper { 

    public short[] flip(short[] array, int columns) { 
     short[] flipped = new short[array.length]; 
     for(int i=0;i<array.length;i++){ 
      int row = (i/columns); //use the fact that integer/integer is rounded down 
      int column = (i%columns); 
      flipped[i] = array[array.length-((columns*(row+1))-column)]; 
     } 
     return flipped; 
    } 

} 

:

public class FlipperTest { 

    private Flipper flipper = new Flipper(); 

    @Test 
    public void test() { 
     short[] array = new short[]{1,2,3,4,5,6,7,8,9}; 
     short[] actualResult = flipper.flip(array, 3); 
     assertThat(actualResult, equalTo(new short[]{7,8,9,4,5,6,1,2,3})); 
    } 

} 

코드는 자체 설명이다 희망

+1

+1 루프가있는 솔루션의 경우 +1. 제자리는 아니지만 제자리에서 쉽게 만들 수 있습니다. 나를 위해 읽을 수있는 적은. 참고 : "행"은 1 기반이지만 "열"은 0 기반입니다. 이는 코드에서 언급 한 것, 바람직하게는 변수 이름 또는 최소한 인라인 문서의 장점을 제공합니다. –

+0

@Andy Thomas-Cramer - 동의합니다. – macias