DEV Community

Cover image for C# - Jagged Array
FakeStandard
FakeStandard

Posted on • Edited on

C# - Jagged Array

最近在 LeetCode 刷題時,發現一個我不知道的東西—不規則陣列(Jagged Array)

從古自今,筆者對於陣列的認知不外乎就是一維與多維陣列,然而在工作上也從未遇過不規則陣列的使用,導致近日在刷題時,曾一度懷疑自己的眼睛,這是不是打錯了?井底之蛙的我馬上跪拜古哥,結果在 C# 程式設計手冊發現了它的蹤影,廢話不多說,馬上來看!

不規則陣列(Jagged Array)是陣列的一種,其陣列內的元素也是陣列,不規則陣列的元素可以具有不同維度及大小,也是與多維陣列明顯的差異之處。

不規則陣列的宣告及初始化

// 不規則陣列的宣告方式
int[][] array = new int[5][];

// 初始化元素
array[0] = new int[6];
array[1] = new int[5];
array[2] = new int[4];
array[3] = new int[3];

// 使用 Initializer 直接填入陣列元素的值,無須設置大小
array[0] = new int[]{ 1, 2, 3 };
array[1] = new int[]{ 4, 6 };
array[2] = new int[]{ 7 };
Enter fullscreen mode Exit fullscreen mode

從上述可知,多維陣列在同一維度下的元素大小必須相同,而不規則陣列的元素大小可以不同,不規則陣列內的元素是陣列,又稱為陣列中的陣列。

我們也可以在宣告時直接初始化元素

// 宣告時直接初始化
int[][] array = new int[][]
{
    new int[]{ 1, 2, 3 },
    new int[]{ 4, 6 },
    new int[]{ 7 }
};

// 或是不使用 new 運算子的縮寫格式
int[][] array =
{
    new int[]{ 1, 2, 3 },
    new int[]{ 4, 6 },
    new int[]{ 7 }
};
Enter fullscreen mode Exit fullscreen mode

其指派值的方式與多維陣列相同

// 指派值 100 到第 [0] 個陣列的第 [1] 個元素
array[0][1] = 100;
// 指派值 100 到第 [1] 個陣列的第 [2] 個元素
array[1][2] = 200;
Enter fullscreen mode Exit fullscreen mode

以上介紹的是一維不規則陣列,其中皆包含一維陣列的元素。不規則陣列還可以使用混合的不規則陣列,比如說,宣告及初始化一維不規則陣列,其中包含三個大小不同的二維陣列元素。

// 宣告及初始化
int[][,] array = new int[3][,]
{
    new int[,]{ {1,2}, {3,4}},
    new int[,]{ {5,6}, {7,8}, {9,10}},
    new int[,]{ {11,12}, {13,14}, {15,18}, {100,220}}
};

// 存取值的方式
Console.WriteLine(array[0][1,0]);
array[0][1,0] = 4;
Console.WriteLine(array[0][1,0]);
Enter fullscreen mode Exit fullscreen mode

以筆者目前的工作性質來說,較不容易使用到不規則陣列,若以遊戲方面來說,我想物品欄應可透過這種方式來存取。

了解多維陣列與不規則陣列的差別後,還有一點很重要,多維陣列在分配空間上,所有元素的長度是固定大小,而不規則陣列的元素長度可以依需求分配,故不規則陣列對於空間利用優於多維陣列。

實際以儲存 1-5 的數字來看,二維陣列對子元素的空間分配必須是相同長度,故在存放 5 後的空間位置須補上 0,此處就是一個未被利用的空間;不規則陣列對子元素的空間分配較彈性,可以完全依照需求長度進行配置,才不會造成空間浪費

// 二維陣列
int[,] arr1 = new int[,]
{ 
    { 1, 2, 3 },
    { 4, 5, 0 } 
};

// 不規則陣列
int[][] arr2 = new int[][]
{
    new int[]{ 1, 2, 3 },
    new int[]{ 4, 5 }
};
Enter fullscreen mode Exit fullscreen mode

使用迭代讀出所有元素方法

// 不規則陣列
int[][] arr = new int[][]
{
    new int[]{ 1, 2, 3 },
    new int[]{ 4, 5 }
};

foreach(int[] item in arr)
{
    foreach(int i in item)
    {
        Console.WriteLine(i);
    }
}
Enter fullscreen mode Exit fullscreen mode

也可以使用 SelectMany() 讀取

var item = arr.SelectMany(s => s);

foreach (var i in item)
{
    Console.WriteLine(i);
}
Enter fullscreen mode Exit fullscreen mode

Thanks for reading the article 🌷 🌻 🌼

If you like it, please don't hesitate to click heart button ❤️
or follow my GitHub ⭐ I'd appreciate it.


Top comments (0)