第 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 混合数组的遍历
混合数组的遍历,一旦搞清楚层次关系和逻辑的时候,我们就可以直接开始遍历了。我们拿基础的锯齿二维数组来遍历:
显然,一旦清楚逻辑后,我们就可以遍历它们了:
再复杂一点:
再复杂一点:
再复杂一点:

