第 21 講:數(shù)組(三):混合數(shù)組
前文我們了解了一種可拆分的數(shù)組類型:鋸齒數(shù)組。今天我們學(xué)習(xí)的是一種稍微難一點(diǎn)的概念:混合數(shù)組(Mixed Array)?;旌蠑?shù)組是將前面兩種數(shù)組模型混用,產(chǎn)生的新的數(shù)組類型。千萬(wàn)別走神,接下來(lái)我們來(lái)理解一下混合數(shù)組的邏輯。
整個(gè)這一節(jié)的內(nèi)容的難度都偏大,按需學(xué)習(xí)。不必掌握它們,但用到的時(shí)候,你可以再回來(lái)看。
Part 1 鋸齒二維數(shù)組里反人類的理解邏輯
既然前面介紹過(guò)鋸齒的一維數(shù)組,那么必然就存在鋸齒二維數(shù)組。那么,鋸齒二維數(shù)組是什么樣的呢?
當(dāng)然,聲明大小的時(shí)候,我們可以省略大小。比如例子里 new int[2][,]
里的 2、new int[2, 3]
里的 2 和 3,還有 new int[4, 5]
不過(guò),你可以看出來(lái),這種寫(xiě)法確實(shí)有點(diǎn)古怪。明明是一個(gè)鋸齒二維數(shù)組,結(jié)果卻是“由若干不同的二維數(shù)組構(gòu)成的大的一維數(shù)組”。這正是混合數(shù)組里最難搞定的地方。在鋸齒一維數(shù)組里,我們將 int[][]
理解為“整個(gè)數(shù)組是一個(gè)大的 []
,每一個(gè)元素都是 []
int[][,]
理解成“整個(gè)數(shù)組是一個(gè)大的 []
,而每一個(gè)元素都是 [,]
的類型”。顯然,[]
表示一個(gè)一維數(shù)組,而 [,]
則表示一個(gè)二維數(shù)組,所以 int[][,]
就是在說(shuō),整體是一個(gè)一維數(shù)組,而每一個(gè)元素都是一個(gè)二維數(shù)組,元素類型由 int
的實(shí)體構(gòu)成。
當(dāng)然,這類數(shù)組取值也是和標(biāo)記 [][,]
是一樣的:
我指的是,取值的中括號(hào)書(shū)寫(xiě)風(fēng)格是和聲明語(yǔ)句里的 [][,]
標(biāo)記是一樣的。這里 arr[1][2, 3]
表示取 arr
盡管有點(diǎn)麻煩,你依然要明白,數(shù)組這一點(diǎn)比較嚴(yán)謹(jǐn)?shù)谋磉_(dá)邏輯。
Part 2 二維鋸齒數(shù)組
如果記號(hào) [][,]
反過(guò)來(lái)呢?[,][]
又能表達(dá)什么呢?
看這個(gè)例子。這個(gè)例子告訴你,實(shí)際上整個(gè)數(shù)組類型 int[,][]
想表示一個(gè)二維數(shù)組,只是下面的每一個(gè)元素都是一個(gè)一維數(shù)組類型的實(shí)體。和前面的理解方式完全類似:int[][,]
理解成“int
元素、大數(shù)組是 []
類型,每一個(gè)元素都是一個(gè) [,]
”。這里 int[,][]
就可以理解成“int
元素、大數(shù)組是 [,]
類型,每一個(gè)元素都是一個(gè) []
”。
我不是很想要提名字。前面那種叫鋸齒二維數(shù)組,而這個(gè)叫二維鋸齒數(shù)組。注意名字的順序。將“二維”放在前面和放在后面是不一樣的:二維鋸齒數(shù)組是在說(shuō),數(shù)組本身就是二維的,只是元素是鋸齒數(shù)組;而“鋸齒”放在前面,則在說(shuō)明數(shù)組本身是鋸齒的數(shù)組,只是數(shù)組的元素類型并不是等大小的一維數(shù)組了,而是二維數(shù)組。
Part 3 我就要搞事情
簡(jiǎn)單看個(gè)例子就可以了。
int[,][][]
啊、int[][,][]
啊、int[][][,]
都是些啥玩意兒。反正我們也用不上。
Part 4 混合數(shù)組的遍歷
混合數(shù)組的遍歷,一旦搞清楚層次關(guān)系和邏輯的時(shí)候,我們就可以直接開(kāi)始遍歷了。我們拿基礎(chǔ)的鋸齒二維數(shù)組來(lái)遍歷:
顯然,一旦清楚邏輯后,我們就可以遍歷它們了:
再?gòu)?fù)雜一點(diǎn):
再?gòu)?fù)雜一點(diǎn):
再?gòu)?fù)雜一點(diǎn):