图片处理(Picture Lab)活动4:Java中的二维数组
在本活动中你需要用二维数组来存放整数数据。一些编程语言使用一维数组来表示二维数组,可能将同行元素储存在一起(row-major order),也可能将同列元素储存在一起(column-major order)。具体而言,同行元素储存在一起的一维数组中,第一行数据之后紧接着的是第二行的数据,直到最后一行。同列元素储存在一起的一维数组中,第一列数据之后紧接着的是第二列的数据,直到最后一列。这两种不同的储存方式决定了如何把二维数组索引换算成对应的一维数组索引。对于Java而言,行和列均被索引,且从0开始。行号从上到下依次递增,列号从左到右依次递增。

对于以上二维数组,同行元素储存在一起会是:

对于以上二维数组,同列元素储存在一起会是:

事实上,Java使用数组的数组来表示二维数组。这意味着外层数组的每个元素是另一个数组的引用。数据可以任意采用两种储存顺序之一。不过AP计算机科学课程规定所有二维数组都将同行元素储存在一起,因而外层数组表示行,内层数组表示列。下图分别展示了同行和同列着两种顺序。

下表列出了Java二维数组的基本语法和操作例子。Java支持基本数据和对象的二维数组。
| 任务 | Java语法 | 例子 |
| 声明二维数组 | type[][] name |
int[][] matrix
|
| 创建二维数组 | new type[nRows][nCols] |
new int[5][8]
|
| 读取元素 | name[row][col] |
int value = matrix[3][2];
|
| 复制元素 | name[row][col] = value |
matrix[3][2] = 6;
|
| 获得行数 | name.length |
matrix.length
|
| 获得列数 | name[0].length |
matrix[0].length
|
为在循环中遍历二维数组的元素,需要为行列都设置索引。可以使用嵌套循环(nested loop),即一个for循环包含另一个for循环来做到这一点。
以下是class IntArrayWork中的一个method,使用一个field来累加计算名为matrix的二维数组中全部整数的和。可以留意嵌套的for循环,以及使用matrix.length来获得行数与使用matrix[0].length来获得列数。因为matrix[0]将会返回一个二维数组的内层数组,matrix[0].length会对应列数。
public int getTotal() {
int total = 0;
for (int row = 0; row < matrix.length; row++) {
for (int col = 0; col < matrix[0].length; col++) {
total = total + matrix[row][col];
}
}
return total;
}
因为Java的二维数组本质上是数组的数组,所以也可以用嵌套的for-each循环来将二维数组的所有元素求和。外层循环会遍历外层数组(每行),而内层循环则会遍历内层数组(行的每一列)。这样一来你就不必直接操作索引了。
public int getTotalNested() {
int total = 0;
for (int[] rowArray : matrix) {
for (int item : rowArray) {
total = total + item;
}
}
return total;
}
练习
- 在
class IntArrayWork中编写getCountmethod,返回给定整数在二维数组matrix中出现的次数。class IntArrayWorkTester中已经有名为testGetCount()测试method。取消注释,并在IntArrayWorkTester的mainmethod中调用,验证你所编写的getCount是否正确。 - 在
class IntArrayWork中编写getLargestmethod,返回二维数组matrix的最大元素。同样使用testGetLargest()来测试新method。 - 在
class IntArrayWork中编写getColTotalmethod,返回二维数组matrix每列元素之和。同样使用testGetColTotal()来测试新method。
0 条评论