二维数组
二维数组的基础知识
要点提示:二维數组中的元素通过行和列的下标来访问。
如何声明一个二维数组变量?如何创建一个二维数组?如何访问二维数组中的元素?
声明二维数组变置并创建二维数组
下面是声明二维数组的语法:
数据类型[] []数组名 :
或者
数据类型数组名[] [] ; //允许这种方式 ,但并不推荐使用它
作为例子,
下面演示如何声明 int 型的二维数组变量 matrix:
int[] [] matrix;
或者
int matrix[][];// 允许这种方式 ,但并不推荐使用它
可以使用这个语法创建 5 x 5 的 int 型二维数组,并将它陚值给 matHx:
matrix = new int[5] [5];
也可以这样获取一个数组:(例如:创建一个3行4列的二维数组)创建个指定元素的二维数组
int[][] matrix=new int[][]{ int[][] matrix={
{1,2,3,4} , {1,2,3,4} ,
{5,6,7,8} , {5,6,7,8} ,
{9,10,11,12} {9,10,11,12}
}; };
锯齿矩阵/二维数组
int[][] matrix={
{1,2,3,4} ,
{5,6,7} ,
{8,9},
{10}
};
特别的,如果一个二维数组的行和列相等的话,也称之为是方阵
二维数组中使用两个下标,一个表示行,另一个表示列。同一维数组一样,每个下标索 引值都是 int 型的,从 0 开始,如图 8-la 所示。

如图 8-1b所示,要将 7 賦值给行下标为2、列下标为1的特定元素,可以使用下面的语句:
matrix[2] [l]= 7;
瞥告:使用 matrix[2,l]访问行下标为 2、列下标为丨的元素是一种常见错误。在 Java 中, 每个下标必须放在一对方括号中。
也可以使用数组初始化来声明、创建和初始化一个二维数组。例如:下图 a 中的代码创 建一个具有特定初值的数组,如图 8-1c 所示。它和图 b中的代码是等价的。

获取二维数组的长度
二维数组实际上是一个数组,它的每个元素都是一个一维数组。数组 X 的长度是数组中 元素的个数,可以用 x.length 获取该值。元素 x[0], x[l],…,x[x.length-l]也是数组。 可以使用 x[0].length, x[l].length,…, x[x.length-1].length 获取它们的长度。
例如:假设 x = new int[3][4], 那么 x[0]、x[l] 和 X[2]都是一维数组,每个数组都 包含 4 个元素,如图 8-2 所示。x.length 为 3, x[0].length、x[l].length 和 x[2].length 都是 4。

锯齿数组
二维数组中的每一行本身就是一个数组,因此,各行的长度就可以不同。这样的数组称 为锯齿数组(ragged array)。下面就是一个创建锯齿数组的例子:

从上图中可以看到,triangleArray[0].length 的值为 5,triangleArray[l].length 的值为 4,triangleArray[2].length的值为 3,triangleArray[3].length 的值为 2, triangleArray[4]. length 的值为1。
如果事先不知道锯齿数组的值,但知道它的长度,正如前面讲到的,可以使用如下所示 的语法创建锯齿数组:
int[][] triangleArray = new int[5][];
triangleArray[0] = new int[5];
triangleArray[l] = new int[4];
triangleArray[2] = new int[3];
triangleArray[3] = new int[2];
triangleArray[4] = new int[l];
现在可以给数组賦值,例如:
triangleArray[0][3] - 50;
triangleArray[4][0] * 45;
注意:使用语法 new in‘ t[5][]创建数组时,必须指定第一个下标。语法 new int[]□ 是 错误的
处理二维数组
要点提示:嵌套的 for 循环常用于处理二维数组。
假设如下创建数组 matrix:
int[][] matrix = new int[10][10];
下面是一些处理二维数组的例子:
1 )(使用输入值初始化数组)下面的循环使用用户输人值初始化数组:
java.util.Scanner input = new Scanner(System.in);
System.out.println("Enter + matrix.length + " rows and " + matrix[0].length + "columns:);
for (int row=0; row < matrix.length; row++){
for (int column = 0; column < matr1x[row].length; column++){
matrix[row][column] = input.nextlnt();
}
}
2)(使用随机值初始化数组)下面的循环使用 0 到 99 之间的随机值初始化数组:
for (int row = 0; row < matrix.length; row++){
for (int column = 0; column < matrix[row].length; column++){
matrix[row][column] = (int) (Math.random() * 100);
}
}
3 )(打印數组)为打印一个二维数组,必须使用如下所示的循环打印数组中的每个元素:
for (int row = 0; row < matrix.length; row++){
for (int column = 0; column < matrix[row].length; column++){
System.out.print(matrix[row][column] + " " );
}
System.out.println();
}
4)(求所有元素的‘ 和)使用名为 total 的变量存储和。将 total 初始化为 0。利用类似 下面的循环,把数组中的每一个元素都加到 total 上:
int total = 0;
for(int row = 0; row < matrix.length; row++){
for(int column = 0; column < matrix[row] .length; column++){
total +-matrix[row] [column];
}
}
5 )(对数组按列求和)对于每一列,使用名为 total 的变量存储它的和。利用类似下面 的循环,将该列中的每个元素加到 total 上
for(int column = 0; column < matrix[0].length; column—){
int total-0;
for (int row = 0; row < matrix.length; row++)
total += matrix[row] [column] ;
System.out.println("Sum for column " + column + " is ’’ + total);
}
6) (哪一行的和最大?)使用变量 maxRow 和 indexOfMaxRow 分别跟踪和的最大值 以及该行的索引值。计算每一行的和,如果计算出的新行的和更大,就更新 maxRow 和 indexOfMaxRow。
int maxRow = 0;
int indexOfMaxRow * 0;
// Get sum of the first row in maxRow
for(int column = o; column < matrix[0].length; column++){
maxRow += matrix[0] [column] ;
}
for(int row = 1; row < matrix.length; row++){
int totalOfThisRow = 0;
for(int column = 0; column < matrix[row].length; column++)
totalOfThisRow += matrix[row] [column] ;
if(totalOfThisRow > maxRow){
maxRow = totalOfThisRow;
indexOfMaxRow = row;
}
}
System.out.println("Row " + indexOfMaxRow + " has the maximum sum of •• + maxRow) ;
7)(随意打乱)在 7.2. 6 节中已经介绍了如何打乱一维数组的元素,那么如何打乱二维 数组中的所有元素呢?为了实现这个功能,对每个元素 Hiatrix[i] [j] , 随机产生下标 il 和 jl, 然后互换 matrix[ i] [j]和 matrix[il] [jl] , 如下所示:
for(int i = 0; i < matrix.length; i++){
for(int j = 0; j < matrix[ i].length; j++){
int i1 = (int) (Math.random() = matrix.length) ;
int j1 = (int) (Math.random() = matrix[i] .length) ;
// Swap matrix[i] [j] with matrix[i1][j1]
int temp = matrix[i][j] ;
matrix[i] [j] = matrix[i1][j1] ;
matrix[i1][j] = temp;
}
}
将二维数组传递给方法
要点提示:将一个二维数组传递给方法的时候,数组的引用传递给了方法
可以像传递一维数组一样,给方法传递二维数组。也可以从一个方法返回一个数组。
第一个方法: getArray( ), 返回一个二维数组
import java.util.Scanner;
class PassTwoDimensionalArray {
Scanner input = new Scanner(System.in);
public static void main(String[] args) {
int[][] m = getArray(); // Get an array
// Display sum of elements
System.out.println("\nSum of all elements is " + sum(m));
}
//第一个方法,getArray(), 返回一个二维数组;
public static int[][] getArray() {
// Enter array values
int[][] m = new int[3][4];
System.out.println("Enter " + m.length + " rows and " + m[0].length +"columns:");
for (int i = 0; i < m.length; i++) //从键盘获取一个二维数组的循环
for (int j = 0; j < m[i].length;j++)
m[i][j] = input.nextlnt();
return m; //返回一个数组
}
//第二个方法,sum(int[][] m), 返回一个矩阵中所有元素的和。
public static 1nt sum(1nt[][] m) {
int total = 0;
for (int row = 0; row < m.length; row++) {
for (int column = 0; column < m[row].length; column++) {
total += m[row][column]; //累加,计算所有数据的和
}
}
return total ; //返回一个数字,数组所有数据之和
}
}
运行结果:
