前面的章节我们讲述了二维数组以及多维数组的输入、输出和复制。
其实我们可以看得出来多维数组是将二维数组再次数组化,今天我们来看看能否从多维数组中将二维数组“分离”出来。
一、从多维数组分离二维数组
前面我们已经讲述了多维数组的定义方式为:数组名[数组组数][元素个数],其实我们进行分离(“抠取”)时,采取的方法依旧是复制,只不过要将多维数组中的“数组名[数组组数]”变为一个“整体”,让其成为二维数组的“数组前缀”。
我们仍旧以上述多维数组作为例子讲解。
int[][] a = new int[][] { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };
我们在main()方法中输入如下代码:
for (int count = 0; count < a.length; count++) {
int[] b = Arrays.copyOf(a[count], a[count].length);
System.out.println(Arrays.toString(b));
}
运行结果:
[1, 2, 3]
[4, 5, 6]
[7, 8, 9]
我们将执行代码和运行结果联系起来看看,可以看出抠取的语法为:Arrays.copyOf(小组号数, 小组的长度);。转换之后我们在输出时就不能使用多维数组的转换方法deepToString()了,而要改为二维数组的转换方法toString()。
我们可以通过改变“小组”的长度来复制相应小组中任意个数的元素。
int e[] = Arrays.copyOf(a[0], 3);
System.out.println(Arrays.toString(e));
e = Arrays.copyOf(a[1], 3);
System.out.println(Arrays.toString(e));
e = Arrays.copyOf(a[2], 3);
System.out.println(Arrays.toString(e));
e = Arrays.copyOf(a[2], 2);
System.out.println(Arrays.toString(e));
e = Arrays.copyOf(a[2], 4);
System.out.println(Arrays.toString(e));
运行结果:
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
[1, 2, 3]
[4, 5, 6]
[7, 8, 9]
[7, 8]
[7, 8, 9, 0]
这种复制实则是对“抠取”过后的二维数组进行复制,因此超出长度的部分不再用null填补,而是用0填补。
二、“截取”多维数组中的某一部分组成二维数组
当然我们在此也可以思考思考:能否定义一个二维数组:从某号小组中的某个元素开始,到另一个小组中的某个元素结束?
其实是可以的,这个方法类似于“截取”,我们仍以这个多维数组为案例。
我们在main()方法中输入如下代码:
int newArray[] = new int[4];
int j = 1;
int k = 1;
for (int countF = 0; countF < newArray.length;) {
for (; j < a.length;) {
for (; k < a[j].length; k++) {
newArray[countF] = a[j][k];
countF++;
if (countF == newArray.length)
break;
}
j++;
k = 0;
}
}
System.out.println(Arrays.toString(newArray));
运行结果:
[5, 6, 7, 8]
这段代码中有一行代码不能省略:k = 0;不能省略,这行代码确定了从选定元素开始向后选取的过程中,其后的每小组元素都从该小组的1号元素(位置0)开始选取(位置归零),否则其后的每小组的“1号元素”都以第一小组选定的“1号元素”所在的位置作为起始位置(位置不归零)。我们看看不加k = 0;的情况。
在此我们利用常规的写法:
int newArray[] = new int[4];
for (int countF = 0; countF < newArray.length;) {
for (int j = 1; j < a.length; j++) {
for (int k = 1; k < a[j].length; k++) {
newArray[countF] = a[j][k];
countF++;
if (countF == newArray.length)
break;
}
}
}
System.out.println(Arrays.toString(newArray));
运行结果:
[5, 6, 8, 9]
为什么会出现这种结果?因为每一小组中位置号都是从位置k开始输出的:k若“归零”,则从位置0开始输出,否则每一小组都从k位置上的元素开始输出,k位置之前的元素都被省却。
不过这段代码稍有残缺,因为新的二维数组的起始元素以a[j][k](j、k为自定的初始值,在这段代码中,我们将j、k均设定为1,所以新的二维数组的起始元素为多维数组中的a[1][1]位置的元素),我们同时得设定好新的二维数组的长度:不能超过多维数组中从选定元素开始到结尾元素的长度,否则代码如法执行。关于这一点暂时不做讨论。