JAVA数组 第三篇:从多维数组中分离二维数组;“截取”多维数组中的某一部分组成二维数组

前面的章节我们讲述了二维数组以及多维数组的输入、输出和复制。

其实我们可以看得出来多维数组是将二维数组再次数组化,今天我们来看看能否从多维数组中将二维数组“分离”出来。

一、从多维数组分离二维数组

前面我们已经讲述了多维数组的定义方式为:数组名[数组组数][元素个数],其实我们进行分离(“抠取”)时,采取的方法依旧是复制,只不过要将多维数组中的“数组名[数组组数]”变为一个“整体”,让其成为二维数组的“数组前缀”。

我们仍旧以上述多维数组作为例子讲解。

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]位置的元素),我们同时得设定好新的二维数组的长度:不能超过多维数组中从选定元素开始到结尾元素的长度,否则代码如法执行。关于这一点暂时不做讨论。

你可能感兴趣的:(JAVA,数组)