왜 우리는 들쭉날쭉 한 배열과 다차원 배열을 가지고 있습니까?


87
  1. 들쭉날쭉 한 배열과 다차원 배열의 차이점은 무엇입니까? 서로의 이점이 있습니까?

  2. 그리고 왜 Visual Studio에서 내가

    MyClass[][] abc = new MyClass[10][20];
    

    (예전에는 C ++에서 사용했지만 C #에서는 [20]에 빨간색 물결 선으로 밑줄을 긋습니다. 잘못된 순위 지정자를 말합니다.)

    그러나 행복하다

    MyClass[,] abc = new MyClass[10,20];
    
  3. 마지막으로 어떻게 이것을 한 줄로 초기화 할 수 있습니까 (간단한 배열에서 {new xxx...}{new xxx....})

    MyClass[][,][,] itemscollection;
    

11
들쭉날쭉 한 배열의 요점은 "중첩 된"배열이 균일 한 크기 일 필요가 없다는 것입니다.
Ani

1
msdn.microsoft.com/en-us/library/2yd9wwz4(v=vs.71).aspx- 문서에 따라 [X, Y]와 같은 다차원 배열 구문이 유효 함
ndtreviv

추가 하위 질문 : 다차원 배열에서 foreach ()를 사용할 수 있습니까?
Serge Wautier 2011 년

@Serge - 물론, 같은 Array구현 IEnumerable. 당신은 항상 :)을 시도하고 직접 볼 수 있었다
thecoop

답변:


101
  1. 들쭉날쭉 한 배열은 배열의 배열이므로 an은의 배열이며 , 각 int[][]배열 int[]은 서로 다른 길이를 가질 수 있으며 메모리에서 자체 블록을 차지할 수 있습니다. 다차원 배열 ( int[,])은 단일 메모리 블록 (본질적으로 행렬)입니다.

  2. MyClass[10][20]각 하위 배열은 별도의 개체이므로 개별적으로 초기화해야하므로을 만들 수 없습니다 .

    MyClass[][] abc = new MyClass[10][];
    
    for (int i=0; i<abc.Length; i++) {
        abc[i] = new MyClass[20];
    }
    

    A MyClass[10,20]는 괜찮습니다. 단일 객체를 10 개의 행과 20 개의 열이있는 행렬로 초기화하기 때문입니다.

  3. A MyClass[][,][,]는 다음과 같이 초기화 될 수 있습니다 (컴파일 테스트가 아님) :

    MyClass[][,][,] abc = new MyClass[10][,][,];
    
    for (int i=0; i<abc.Length; i++) {
        abc[i] = new MyClass[20,30][,];
    
        for (int j=0; j<abc[i].GetLength(0); j++) {
            for (int k=0; k<abc[i].GetLength(1); k++) {
                abc[i][j,k] = new MyClass[40,50];
            }
        }
    }
    

CLR은 1 차원 배열 액세스에 최적화되어 있으므로 들쭉날쭉 한 배열을 사용하는 것이 동일한 크기의 다차원 배열보다 빠를 가능성이 높습니다.


6
1 차원 배열 액세스가 더 빠르다는 몇 가지 증거를 알려 주시겠습니까?
GreyCloud


다차원 배열에 대한 (일반적인) 사용 사례가 있습니까?
ryanwebjackson

1
예 : 체크 무늬 보드 var board = new Piece[8, 8];, 변환 매트릭스 var m = new double[2, 2]; .
Olivier Jacot-Descombes 2019

37

들쭉날쭉 한 배열은 배열의 배열입니다. 각 어레이의 크기가 같지 않을 수도 있습니다. 당신은 가질 수 있습니다

int[][] jaggedArray = new int[5][];
jaggedArray[0] = new[] {1, 2, 3}; // 3 item array
jaggedArray[1] = new int[10];     // 10 item array
// etc.

그것은 세트입니다관련된 배열 입니다.

반면에 다차원 배열은 불규칙한 길이가없는 상자, 테이블, 큐브 등과 같이 응집력있는 그룹입니다. 즉 말하자면

int i = array[1,10];
int j = array[2,10]; // 10 will be available at 2 if available at 1

나는 당신의 코드를 시도했습니다. 컴파일되지 않았습니다. int [3]를 추가해보십시오 jaggedArray[0] = int[3]{ 1, 2, 3 }.
barlop

나는 이것이 오래되었다는 것을 알고 있지만 단지 정보를 목적으로하는 int [3]은 필요하지 않다. 간단한 int [] 만 있으면됩니다. int [] [] myArray = 새로운 int [5] []; myArray [0] = 새로운 int [] {1, 2, 3, 4}; 이것이 필요한 전부입니다.
Velocibadgery

이것을 C #으로 컴파일 할 수 있습니까? jaggedArray[0] = { 1, 2, 3 };변경하지 않으면 컴파일 할 수 없습니다 = new[] { 1, 2, 3 }(또는 = new int[] { 1, 2, 3 }C # 3.0 이전). Microsoft의 C # 프로그래밍 가이드에 따르면 "배열 변수를 만들지 않고도 선언 할 수 있지만이 변수에 새 배열을 할당 할 때는 new 연산자를 사용해야합니다."
Joel V. Earnest-DeYoung

11

직사각형 배열에는 항상 모든 행에 대해 동일한 양의 열이 있습니다.

MyClass[,] x = new MyClass[10,30]

모든 행에는 30 개의 열이 있지만 들쭉날쭉 한 배열에서는 필요하지 않습니다. 따라서 들쭉날쭉 한 배열의 모든 '행'을 개별적으로 초기화해야한다고 생각합니다.

MyClass[][] x = new MyClass[10][];

for(int i = 0; i < 10; i++)
{
    x[i] = new MyClass[30];
}

사실, 이것은 들쭉날쭉 한 배열의 모든 행이 동일한 수의 요소를 포함하지 않아야 함을 의미합니다. (제 예에서는 동일한 수의 요소가 있지만 필수는 아닙니다.)

예를 들어 다음과 같이 완벽하게 수행 할 수 있습니다.

MyClass[][] x = new MyClass[10][];

for(int i = 0; i < 10; i++)
{
    x[i] = new MyClass[(30 + i)];
}

이것은 당신에게 흥미로운 기사가 ​​될 것입니다.


5

광고 3)와 같은 괴물을 초기화하려면 [][,][,]다음과 같이 할 수 있습니다.

        int [,][,] multiArr1 = { { new int[,] { { 2, 2 }, { 1, 1 } },
                                     new int[,] { { 2, 2 }, { 1, 1 } } },
                                     { new int[,] { { 2, 2 }, { 1, 1 } },
                                         new int[,] { { 2, 2 }, { 1, 1 } } } };
        int [,][,] multiArr2 = { { new int[,] { { 2, 2 }, { 1, 1 } },
                                     new int[,] { { 2, 2 }, { 1, 1 } } },
                                     { new int[,] { { 2, 2 }, { 1, 1 } },
                                         new int[,] { { 2, 2 }, { 1, 1 } } } };

        int [][,][,] superMultiArray = { multiArr1, multiArr2 };

1

경계가 설정된 다차원 배열을 찾고 있다면 항상 [,]스타일 구문을 사용하십시오 . 이렇게하면 각 부분의 크기가 동일합니다.

[][]실제로 사용 하는 것은 배열의 배열을 만드는 것입니다. 이는 각 배열의 크기를 다르게 조정할 수 있음을 의미합니다. 예를 들면 :

int[][] jaggedArray = new int[5][]
for(int index = 0; index < jaggedArray.Length ; ++index)
{
    jaggedArray[index] = new int[index + 1];
}


1

# 1의 경우이 SO 질문을 참조하십시오.

들쭉날쭉하거나 다차원 인라인 배열의 경우 다음 프로그래밍 가이드를 참조하세요 .

// Three-dimensional array.
int[, ,] array3D = new int[,,] { { { 1, 2, 3 }, { 4, 5, 6 } },
{ { 7, 8, 9 }, { 10, 11, 12 } } };

// Same array with dimensions specified at declaration.
int[, ,] array3Da = new int[2, 2, 3] { { { 1, 2, 3 }, { 4, 5, 6 } },
{ { 7, 8, 9 }, { 10, 11, 12 } } };

치수 (array3D)를 지정할 필요는 없지만 치수가 변경되지 않을 것임을 알고 있다면 사용중인 치수 (array3Da)를 아는 것이 도움이됩니다.


0

이중 인덱싱이 단일 인덱스로 변환된다는 점을 제외하고는 다차원 배열이 단일 차원 배열로 작동하는 배열의 내부 작업을 이해해야합니다.

C #의 Jagged 배열은 차례대로 배열되는 객체의 배열입니다.


0

저는 C #의 2d 들쭉날쭉 한 배열 메모리 할당이 C ++ 및 C의 2d 배열과 비슷하다고 생각합니다. 2d 들쭉날쭉 한 배열에는이 포인터 각각이 요소 배열 (예 : 정수 요소)을 가리키는 포인터 배열을 가리키는 포인터가 있기 때문입니다. C ++의이 코드처럼

int** 2DArr {new int* [number1]};
for (int i = 0; i < number1; i++)
{
   2DArr[i] = new int[number2];
}

아래 코드의 메모리 할당은 C #의 2d 들쭉날쭉 한 배열과 동일합니다. 그러나 나는 의심 스럽습니다. 내가 잘못 생각하면 더 설명해 주시겠습니까?


0

이 게시물은 오래되었지만 여기에 대한 내 생각이 있습니다.

들쭉날쭉 한 배열은 다차원 배열입니다. 다차원 배열은 직사각형과 톱니 모양의 두 가지 유형이 있습니다. 직사각형 배열은 메모리의 n 차원 블록을 나타내며 들쭉날쭉 한 배열은 배열의 배열입니다.

직사각형 배열

직사각형 배열은 각 차원을 구분하기 위해 쉼표를 사용하여 선언됩니다. 다음 문은 차원이 3 × 3 인 직사각형 2 차원 배열을 선언합니다.

int[,] matrix = new int [3, 3]; 

들쭉날쭉 한 배열

들쭉날쭉 한 배열은 연속적인 대괄호를 사용하여 선언되어 각 차원을 나타냅니다. 다음은 가장 바깥 쪽 차원이 3 인 들쭉날쭉 한 2 차원 배열을 선언하는 예입니다.

int[][] matrix = new int[3][];

0

다차원 배열의 경우 상자 또는 직사각형을 생각하십시오. 각 행은 길이가 같고 각 열은 길이가 같습니다.

들쭉날쭉 한 배열에서는 행과 열의 크기가 같지 않을 수 있습니다. 예를 들어 열 또는 행의 크기가 다를 수 있습니다. 이것은 직사각형처럼 측면 아래로 직선이 아닐 수도있는 모양으로 이어질 것입니다. 대신 측면이 들쭉날쭉 할 수 있습니다 .

이제이 예에서는 2 차원 / 2 배열을 사용했지만 더 많은 경우에 적용됩니다.

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