图片处理(Picture Lab)活动4:Java中的二维数组

陈 欣发布

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

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

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

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

下表列出了Java二维数组的基本语法和操作例子。Java支持基本数据和对象的二维数组。

任务  Java语法  例子
声明二维数组 type[][] name int[][] matrix

Pixel[][] pixels

创建二维数组 new type[nRows][nCols] new int[5][8]

new Pixel[numRows][numCols]

读取元素 name[row][col] int value = matrix[3][2];

Pixel pixel = pixels[r][c];

复制元素 name[row][col] = value matrix[3][2] = 6;

pixels[r][c] = aPixel;

获得行数 name.length matrix.length

pixels.length

获得列数 name[0].length matrix[0].length

pixels[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;
}

练习

  1. class IntArrayWork中编写getCount method,返回给定整数在二维数组matrix中出现的次数。class IntArrayWorkTester中已经有名为testGetCount()测试method。取消注释,并在IntArrayWorkTestermain method中调用,验证你所编写的getCount是否正确。
  2. class IntArrayWork中编写getLargest method,返回二维数组matrix的最大元素。同样使用testGetLargest()来测试新method。
  3. class IntArrayWork中编写getColTotal method,返回二维数组matrix每列元素之和。同样使用testGetColTotal()来测试新method。

陈 欣

AADPS创始人

0 条评论

发表回复