最近在 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 };
從上述可知,多維陣列在同一維度下的元素大小必須相同,而不規則陣列的元素大小可以不同,不規則陣列內的元素是陣列,又稱為陣列中的陣列。
我們也可以在宣告時直接初始化元素
// 宣告時直接初始化
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 }
};
其指派值的方式與多維陣列相同
// 指派值 100 到第 [0] 個陣列的第 [1] 個元素
array[0][1] = 100;
// 指派值 100 到第 [1] 個陣列的第 [2] 個元素
array[1][2] = 200;
以上介紹的是一維不規則陣列,其中皆包含一維陣列的元素。不規則陣列還可以使用混合的不規則陣列,比如說,宣告及初始化一維不規則陣列,其中包含三個大小不同的二維陣列元素。
// 宣告及初始化
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]);
以筆者目前的工作性質來說,較不容易使用到不規則陣列,若以遊戲方面來說,我想物品欄應可透過這種方式來存取。
了解多維陣列與不規則陣列的差別後,還有一點很重要,多維陣列在分配空間上,所有元素的長度是固定大小,而不規則陣列的元素長度可以依需求分配,故不規則陣列對於空間利用優於多維陣列。
實際以儲存 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 }
};
使用迭代讀出所有元素方法
// 不規則陣列
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);
}
}
也可以使用 SelectMany()
讀取
var item = arr.SelectMany(s => s);
foreach (var i in item)
{
Console.WriteLine(i);
}
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)