2D 배열, 행 또는 열에서 먼저 오는 것은 무엇입니까?


답변:


90

Java는 "행 주"로 간주됩니다. 즉, 행을 먼저 수행합니다. 이는 2D 배열이 "배열의 배열"이기 때문입니다.

예를 들면 :

int[ ][ ] a = new int[2][4];  // Two rows and four columns.

a[0][0] a[0][1] a[0][2] a[0][3]

a[1][0] a[1][1] a[1][2] a[1][3]

다음과 같이 시각화 할 수도 있습니다.

a[0] ->  [0] [1] [2] [3]
a[1] ->  [0] [1] [2] [3]

두 번째 그림은 "어레이 배열"측면을 보여줍니다. 첫 번째 배열은를 포함 {a[0] and a[1]}하고 각 배열은 4 개의 요소를 포함하는 배열 {[0][1][2][3]}입니다.

요약 :

Array[number of arrays][how many elements in each of those arrays]

자세한 설명은 배열-2 차원을 참조하십시오 .


8
이 답변에서 제공되는 시각화를 즐겼습니다.
Donato

1
이 답변이나 소스 자료가 행이 ​​첫 번째 숫자 여야 함을 설득력있게 보여 준다고 확신하지 못합니다. 열을 먼저 수행 한 다음 행을 수행 할 수없는 이유를 알 수 없습니다. 그리고 그것이 관습이라면 여기에서 그것을 강력하게 입증하는 어떤 것도 보지 못합니다.
Mathieu K.

1
OP는 "왜"Java가 행 주요 인 이유를 묻지 않았습니다 (기술적으로는 그렇지 않지만 메모리 레이아웃에 대해 걱정하지 않는다고 생각한다면 개념화하는 것이 가장 쉽습니다). 그러나 개념적으로 먼저 행을 지정하기 위해 "어떻게 기억합니까"라는 질문을 받았습니다. 저는 시각화가 기억하는 가장 좋은 방법이라고 생각합니다. Java는 실제로 행 주를 사용 하지 않지만 실제로 는 내 대답에서 간략하게 다루면서 배열 배열을 지정합니다. 배치 방법에 대한 설명에 대한 정말 좋은 시각화는 다음에서 찾을 수 있습니다. stackoverflow.com/a/6631081/1366973
MrHappyAsthma

21

Matt B가 어떤 의미에서는 사실 일 수 있지만 기하학 행렬에 대해 전혀 생각하지 않고 Java 다차원 배열을 생각하는 것이 도움이 될 수 있습니다. Java 다차원 배열은 단순히 배열의 배열이며 첫 번째 "차원"의 각 요소는 다른 요소와 크기가 다를 수 있으며 실제로는 null "하위"배열을 저장할 수 있습니다. 이 질문에 대한 의견보기


5
ARRAY 대 MATRIX의 대비 표현 +1! 배열에는 기하학적 정의가 없습니다. 1D 배열이 수직이라고 생각하면 행이 첫 번째이고 1D 배열이 수평이라고 생각하면 col이 먼저입니다. 직사각형 2D 배열을 사용하는 경우 코드 전체에서 동일하게 유지하는 한 논리적 구분이 없습니다. 용도에 따른 구현! (첫 번째 하위 배열 만 통과 할 수있을 때 각 하위 배열의 첫 번째 요소를 탐색하지 마십시오.)
Ron

15

본능적으로 기하학적으로 생각합니다 : 수평 (X) 축과 수직 (Y) 축. 그러나 이것은 2D 배열의 경우가 아니며 행이 먼저 온 다음 열 이옵니다.

다음과 같은 비유를 고려하십시오. 기하학에서 사다리까지 걸어 가고 (X 축) 사다리를 올라갑니다 (Y 축). 반대로 자바에서는 사다리를 내려 가고 (행) 멀리 걸어 간다 (열).


11
@Luiggi 다음을 참조 하십시오. 자신의 질문을 묻고 대답 할 수 있습니다 . 여기에서 찾을 수 있습니다.To be crystal clear, it is not merely OK to ask and answer your own question, it is explicitly encouraged.
Matt B

1
즉 같은 질문에 적용 이 하나 또는 이 좋은 질문입니다 . 또한 두 질문 모두 커뮤니티 위키이며 (투표는이 사람들에게 평판을 추가하지 않음), 좋은 설명이 있으며, 스스로 이익을 얻지 않고 사람들을 돕기 위해 수행됩니다.
Luiggi Mendoza 2012

@ Zéychin 이것은 아마도 채팅에서 더 적절할 것입니다.
Matt B

조옮김을 상상해도 괜찮습니다. 즉, 열이 먼저 온 다음 행이 있다고 상상하면 정말 괜찮습니다. 그리고 이것은 Java로 작성된 매트릭스 연산 알고리즘에서 일반적입니다.
Mohamed El-Nakib 2013 년

불행히도 표준은 없습니다. 사람들이 컴퓨터 화면에 대해 이야기 할 때 "너비 x 높이"(예 : 1024x768 또는 1440x900)라고 말합니다. 하지만 사람들이 레시피 카드에 대해 이야기하면 "3x5 카드"라고 말합니다.
Dave Burton

5

모두 배열의 시각화에 따라 다릅니다. 행과 열은 시각화의 속성입니다. 배열 자체가 아니라 배열 (아마도 상상할 수 있음)입니다.

숫자 "5"가 빨간색인가요 아니면 초록색인가요?

빨간색으로 그릴 수도 있고 욕심으로 그릴 수도 있겠죠? 색상은 숫자의 필수 속성이 아닙니다. 같은 방식으로 2D 배열을 행과 열의 그리드로 나타낼 필요는 없습니다.

2D 배열에는 첫 번째 차원두 번째 차원 만 있습니다. 이를 시각화하는 것과 관련된 모든 것이 순전히 당신의 취향입니다.

char array가있을 때 char[80][25]스크롤없이 화면에 맞는 80 자 25 행이되도록 회전 된 콘솔에 인쇄하고 싶을 수 있습니다.

2D 배열을 행과 열이 전혀 의미가없는 것으로 표현할 때 실행 가능한 를 제공하려고합니다 . 1000000 정수의 배열이 필요하다고 가정 해 보겠습니다. 내 컴퓨터에는 8GB의 RAM이 있으므로 메모리가 충분하지만을 실행 var a = new int[1000000000]하면 OutOfMemory 예외가 발생할 가능성이 큽니다. 이는 메모리 조각화 때문입니다.이 크기의 연속적인 메모리 블록이 없습니다. 대신 값으로 2D 배열 10,000 x 100,000을 만들 수 있습니다. 논리적으로는 1D 배열이므로 단일 값 시퀀스로 그려서 상상하고 싶지만 기술적 구현으로 인해 2D입니다.


흥미로운 점! 배열 배열이 메모리 조각화를 사용하는 방법을 생각하지 못했습니다. 추가로 홈으로 이동하기 위해 첫 번째 숫자는 포인터 수를 나타내고 두 번째 숫자는 각 포인터가 가리키는 배열의 길이를 나타냅니다 (즉, 1D 배열의 2D 버전이 실제로 더 많은 메모리를 할당 함을 의미합니다. 그 포인터).
4castle

@ 4castle, 맞습니다, 들쭉날쭉 한 배열은 동등한 고정 크기 2D 배열보다 약간 더 많은 메모리를 사용하지만 때로는 놀랍게도 OutOfMemory 예외에서 벗어날 수 있습니다. 연속 메모리 블록을 사용하여 큰 개체를 할당하려고하는 .NET 때문이라고 생각합니다 (가상 메모리 블록 매핑이 문제를 해결하지 못하는 이유는 확실하지 않음). 나는 .NET 메모리 모델의 전문가가 아니므로 사실로 받아들이지 마십시오.
Sasha

.그물? 이것은 자바 질문이었습니다. Windows JVM이 .NET을 사용합니까?
4castle

@ 4castle, 죄송합니다. 이미 Java 질문이라는 것을 잊었지만 메모리에서 들쭉날쭉하고 단순한 1 차원 배열을 표현하는 측면에서 .NET과 JVM에는 큰 차이가 없다고 확신합니다.
Sasha

2

Java에는 다차원 배열이 없습니다. 배열의 배열이 있습니다. 그래서:

int[][] array = new int[2][3];

실제로 두 개의 배열로 구성되며 각 배열에는 세 개의 요소가 있습니다.


1
"... 각각 3 개의 배열이 있습니다." "각각 3 개의 요소가 있습니다." 라는 뜻입니까 ? ?
Muhammad Gelbana 2012

1
이 질문에 대한 답이 확실하지 않습니다. 배열의 배열을 선언 할 때 행이 먼저입니까 아니면 열이 먼저입니까?
Mathieu K.

1

행이나 열이 먼저 오는지 기억하는 가장 좋은 방법은 주석을 작성하고 언급하는 것입니다.

Java는 2D 배열을 지정된 행과 열이있는 테이블로 저장하지 않고 다른 많은 답변이 설명하는 것처럼 배열의 배열로 저장합니다. 따라서 첫 번째 또는 두 번째 차원이 행인지 결정할 수 있습니다. 그것에 따라 배열을 읽어야합니다.

그래서 나는 항상 이것에 대해 혼란스러워하기 때문에 2d Array의 어떤 차원이 내 행이고 어느 것이 내 열인지 알려주는 주석을 항상 작성합니다.


0

Java에서는 2 차원 배열이 두 개의 개별 배열로 간주되기 때문에 행이 먼저 수행됩니다. 첫 번째 행 1 차원 배열로 시작합니다.


1
이것은 Java가 아닌 C #입니다. Java 프로그래밍 언어에서 다차원 배열은 구성 요소 자체가 배열 인 배열입니다. 따라서 각 구성 요소 배열의 길이가 다를 수 있습니다. 작성중인이 표기법은 C #으로 작성되어 Java에는없는 직사각형 2D 배열을 강제 적용합니다. 이는 모든 구성 요소 배열이 동일한 길이를 갖도록하는 것과 같습니다.
Mohamed El-Nakib 2013 년

당신에게 :) 무하마드 Annaqeeb 감사
노르 Lababidi

감사합니다. 직사각형 2D 배열 부분에 대한 부분을 몰랐습니다. 도움이되는 답변입니다.
Nour Lababidi

더 자세하고 정확한 답변으로 답변을 업데이트했습니다. 감사합니다.
Nour Lababidi

0

C ++ (멀고 먼지가 많은 메모리)에서는 때때로 Java보다 코드를보고 배열을 이해하는 것이 조금 더 쉬웠다 고 생각합니다. 둘 다 행 메이저입니다. 이 그림은 이해하는 데 도움이되었습니다.

2d 문자열 배열에 대한이 코드가 주어지면 ...

    String[][] messages; 
    messages = new String[][] {
        {"CAT","DOG","YIN","BLACK","HIGH","DAY"},
        {"kitten","puppy","yang","white","low","night"} 
    };
    
    int row = messages.length;
    int col = messages[0].length;
    

2d 배열 (row, col) 인 것처럼 int 이름을 지정하면 값이 표시됩니다.

row = (int) 2
col = (int) 6

우리가 크기를 결정하려고 설정을에 코드의 마지막 두 줄, row그리고 col모든 것을 직관적와 반드시 제대로 보이지 않습니다.

여기서 실제로 처리하는 것은 다음과 같습니다 (설명 할 새 변수 이름에 유의하십시오).

int numOfArraysIn = messages.length;
int numOfElementsIn0 = messages[0].length;
int numOfElementsIn1 = messages[1].length;

어디 messages.length말해 당신은 messages두 개의 배열을 보유하고 있습니다. 배열의 배열입니다.

그리고 messages[x].length0 1 내부 의 각 개별 배열의 크기 산출합니다 messages.

numOfArraysIn = (int) 2
numOfElementsIn0 = (int) 6
numOfElementsIn1 = (int) 6

for each 루프로 인쇄 할 때 ....

for (String str : messages[0])
        System.out.print(str);
for (String str : messages[1])
        System.out.print(str);

CATDOGYINBLACKHIGHDAYkittenpuppyyangwhitelownight

괄호를 떨어 뜨리고 이렇게 인쇄하려고하면 오류가 발생합니다.

for (String str : messages)
        System.out.print(str);

incompatible types: String[] cannot be converted to String

위의 내용은 .length어레이를 통한 단계를 제한 하는 데 사용하는 루프를 설정하는 동안 이해하는 것이 중요합니다 .


0

TStringGrid 셀에서 속성 Col이 먼저옵니다.

Property Cells[ACol, ARow: Integer]: string read GetCells write SetCells;

따라서 할당 StringGrid1.cells[2, 1] := 'abcde';값은 세 번째 열 두 번째 행에 표시됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.