2010-02-04 1 views
28

x, y 좌표 평면 x를 생각하면 y는 정렬 된 쌍의 공통 표기법입니다.하지만 2 자리 배열을 사용하면 myArray [row] [col] 및 y 행이 있습니다. x. 그 반대인가, 아니면 단지 그것에 대해 잘못 생각하고 있는가? 나는 그것이 myArray [x] [y]처럼 보일 것이라고 생각하고 있었지만 실제 행과 열을 원할 경우 (gameboard처럼) 잘못되었다. 행렬 보드를 실제로 흉내내는 것은 myArray [y] [x]가 아닐까? ?2 차원 배열의 x, y 및 row, col 특성은 거꾸로 있습니까?

+0

나는 부모님에게 같은 질문을하는 것을 발견했습니다. 표준이 없다는 것을 알면 좋습니다. –

답변

24

당신은 맞습니다, 그리고 그것은 약간 뒤로 느낍니다. 행 번호는 y 좌표이고 열 번호는 x 좌표이며, 우리는 보통 row, col를 작성하지만 보통 x, y도 씁니다.

배열을 [y] [x] depends 또는 [x] [y]로 쓸지 여부는 주로 메모리의 레이아웃을 얼마나 신경 써야하는지 (사용하는 경우 사용하는 언어) . 행이나 열에서 독립적으로 작동 할 수있는 함수/메서드를 작성할지 여부를 지정합니다.

C/C++ 코드를 작성하는 경우 배열은 Row Major Order에 저장됩니다. 즉, 단일 행의 데이터를 1 차원 배열로 처리 할 수 ​​있습니다. 그러나 하나의 데이터 열은 그럴 수 없습니다. 올바르게 기억하면 VB는 열 주요 순서를 사용하므로 언어가 다릅니다. 나는 C#이 행의 주요 순서가 아니기 때문에 놀랄 것이다. 그러나 나는 모른다.

0

사실, 귀하에게 달려 있습니다. 당신의 질문에는 생각할 권리가 없습니다. 예를 들어, 일반적으로 1 차원 배열을 셀의 행으로 생각합니다. 그래서, 제 마음에 그것은 배열 [열] [행]입니다. 그러나 그것은 당신에게 달려 있습니다 ...

+1

캐시 결과에 대해 생각하고 있다면, 그것을 볼 수있는 올바른 방법이 있습니다. –

+0

@mmeyers : 실제로는 게임 보드를 옆에 보관하는 것이 효과적입니다. 이런 식으로 이미지를 저장하는 것이 일반적입니다. – Joel

+1

나는 그 질문이 어떤 주어진 문맥도 없다고 생각한다 ... 물론 다른 맥락에서, 다른 논리들이있다. – anthares

0

나는 많은 의견이 있습니다. 최종선은 일관성이있는 한 실제로 중요하지 않습니다. 동일한 데이터를 사용하려는 다른 라이브러리 또는 유사 제품이있는 경우 더 쉽게 통합 할 수 있도록 모든 작업을 수행하는 것이 좋습니다.

엄격하게 자신의 코드에있는 경우 편안하게 느끼십시오. 내 개인적인 취향은 myArray [y] [x]를 사용하는 것입니다. 크기가 큰 경우 동시에 액세스 할 항목을 동시에 유지하는 것이 성능상의 이점이 될 수 있습니다. 그러나 나는 전혀 늦게까지 그 일에 대해 걱정하지 않을 것입니다.

0

행을 x 축의 요소로 생각한 다음 2 차원 배열을 y 축의 행 요소로 묶은 다음 행을 조작하려면 y를 사용하는 것이 일반적입니다. x (특정 행 x가 항상 동일하고 y가 인덱스와 함께 변경됨)를 알고 x를 사용하여 여러 행 요소 (행이 세로로 쌓여 있고 특정 y 값에 각각 쌓여 있음)를 조작합니다.

1

데이터를 배열 ([x] [y] 또는 [y] [x])에 저장하는 방법은 중요하지 않습니다. 문제는 배열을 항상 연속적으로 루프하는 것입니다. Java 2 차원 배열은 기본적으로 두 번째 배열을 저장하는 1 차원 배열입니다 (예 : [y] [x]의 경우 [y]의 긴 배열을 가지며 각 y에는 대응하는 [x] 배열이 있음). y의 라인).

효율적으로 전체 배열을 실행하려면 배열에서 검색을 계속 수행 할 필요가 없도록 한 번에 y- 배열 -xarrays에서 다른 y- 배열로 건너 뛰는 방식으로 데이터에 액세스하는 것이 중요합니다. 배열 배열 (array-of-xarrays). 당신이 원하는 것은 하나의 y 요소에 접근하고 그 안에있는 모든 x에 접근하여 다음 y 요소로 이동하는 것입니다.

그래서 Array [y] [x] 상황입니다.

for (int ys = 0; ys < Array[y].length; ys++) 
    for (int xs = 0; xs < Array[y][x].length; xs++) 
    { 
     do your stuff here 
    } 

그리고 물론

가 매 사이클마다 값들을 얻는 데 방지 루프의 안팎 Array.lengths 미리 할당 : 항상 외부 루프의 첫 번째 변수와 내부 루프의 두 번째있다.

관련 문제