第 21 讲:数组(三):混合数组
前文我们了解了一种可拆分的数组类型:锯齿数组。今天我们学习的是一种稍微难一点的概念:混合数组(Mixed Array)。混合数组是将前面两种数组模型混用,产生的新的数组类型。千万别走神,接下来我们来理解一下混合数组的逻辑。
整个这一节的内容的难度都偏大,按需学习。不必掌握它们,但用到的时候,你可以再回来看。
Part 1 锯齿二维数组里反人类的理解逻辑
既然前面介绍过锯齿的一维数组,那么必然就存在锯齿二维数组。那么,锯齿二维数组是什么样的呢?
当然,声明大小的时候,我们可以省略大小。比如例子里 new int[2][,]
里的 2、new int[2, 3]
里的 2 和 3,还有 new int[4, 5]
不过,你可以看出来,这种写法确实有点古怪。明明是一个锯齿二维数组,结果却是“由若干不同的二维数组构成的大的一维数组”。这正是混合数组里最难搞定的地方。在锯齿一维数组里,我们将 int[][]
理解为“整个数组是一个大的 []
,每一个元素都是 []
int[][,]
理解成“整个数组是一个大的 []
,而每一个元素都是 [,]
的类型”。显然,[]
表示一个一维数组,而 [,]
则表示一个二维数组,所以 int[][,]
就是在说,整体是一个一维数组,而每一个元素都是一个二维数组,元素类型由 int
的实体构成。
当然,这类数组取值也是和标记 [][,]
是一样的:
我指的是,取值的中括号书写风格是和声明语句里的 [][,]
标记是一样的。这里 arr[1][2, 3]
表示取 arr
尽管有点麻烦,你依然要明白,数组这一点比较严谨的表达逻辑。
Part 2 二维锯齿数组
如果记号 [][,]
反过来呢?[,][]
又能表达什么呢?
看这个例子。这个例子告诉你,实际上整个数组类型 int[,][]
想表示一个二维数组,只是下面的每一个元素都是一个一维数组类型的实体。和前面的理解方式完全类似:int[][,]
理解成“int
元素、大数组是 []
类型,每一个元素都是一个 [,]
”。这里 int[,][]
就可以理解成“int
元素、大数组是 [,]
类型,每一个元素都是一个 []
”。
我不是很想要提名字。前面那种叫锯齿二维数组,而这个叫二维锯齿数组。注意名字的顺序。将“二维”放在前面和放在后面是不一样的:二维锯齿数组是在说,数组本身就是二维的,只是元素是锯齿数组;而“锯齿”放在前面,则在说明数组本身是锯齿的数组,只是数组的元素类型并不是等大小的一维数组了,而是二维数组。
Part 3 我就要搞事情
简单看个例子就可以了。
int[,][][]
啊、int[][,][]
啊、int[][][,]
都是些啥玩意儿。反正我们也用不上。
Part 4 混合数组的遍历
混合数组的遍历,一旦搞清楚层次关系和逻辑的时候,我们就可以直接开始遍历了。我们拿基础的锯齿二维数组来遍历:
显然,一旦清楚逻辑后,我们就可以遍历它们了:
再复杂一点:
再复杂一点:
再复杂一点: