4.3 二维数组
前面介绍的数组只有一个维度,称为一维数组,其数组元素也只有一个下标变量。在实际问题中有很多情况是二维或多维的,Java语言允许构造多维数组存储多维数据。多维数组的数组元素有多个下标,以标识它在数组中的位置。编程中,经常会用到二维数组,更高维度的数组在实际编程中很少使用,所以这里仅介绍二维数组。
4.3.1 二维数组简介
声明并创建二维数组的语法形式如下。
数据类型[][] 数组名;或 数据类型 数组名[][];
数组名 = new 数据类型[第一维长度] [第二维长度];
在创建的时候,可以同时设置第一维长度和第二维长度,也可以只设置第一维长度,但不可以只设置第二维长度。例如:
int[][] arr = new int[3][4];
在直观上看,上面的例子就是定义了一个3行4列的二维数组,数组名为arr。该数组的下标变量共有12(3×4)个,即:
arr [0][0], arr [0][1], arr [0][2], arr [0][3]
arr [1][0], arr [1][1], arr [1][2], arr [1][3]
arr [2][0], arr [2][1], arr [2][2], arr [2][3]
二维数组本质是一维数组,其中这个一维数组的每个元素都是引用类型,分别指向不同的一维数组,其内存结构和之前介绍的String型一维数组类似。
二维数组的赋值和使用与一维数组类似,都是通过下标访问数组元素,不同的是一维数组只有一个下标,而二维数组有两个下标,分别表示该元素所在数组的行数和列数。例如arr[0][3],其表示的是数组arr中第1行第4列的元素。
在声明并创建数组(int[][] arr = new int[3][4];)之后,可使用的数组下标范围为:arr[0][0]~arr[2][3],这一点和一维数组类似,需要注意数组下标越界的问题。
同一维数组一样,二维数组在创建的时候也可以初始化,例如:
int[][] arr1= \{\{2,3},{1,5},{3,9\}\};//初始化一个3行2列的整型二维数组
int[][] arr2= \{\{1,2,3},{1,5},{3,9\}\};//初始化一个3行的整型二维数组
其中数组arr2第一行有3个元素,第二和第三行有2个元素,对于这类每行元素数不同的二维数组,在使用时尤其需要注意数组下标越界的问题。
4.3.2 二维数组的使用
接下来完成一个案例:某学习小组有4个学生,每个学生有3门课的考试成绩,如表4.1所示。求各科目的平均成绩和总平均成绩。
科目\姓名 | 王云 | 刘静涛 | 南天华 | 雷静 |
---|---|---|---|---|
Java基础 | 77 | 65 | 91 | 84 |
前端技术 | 56 | 71 | 88 | 79 |
后端技术 | 80 | 81 | 85 | 66 |
程序运行结果如图4.12所示,具体代码如下。
import java.util.Scanner;
class Test2Array
{
public static void main(String[] args)
{
int i = 0;
int j = 0;
String[] course = {"Java基础","前端技术","后端技术"};
String[] name = {"王云","刘静涛","南天华","雷静"};
int[][] stuScore = new int[3][4]; //存放所有学生各科成绩
int[] singleSum = new int[]{0,0,0}; //存放各科成绩的和
int allScore = 0; //存放总成绩
Scanner input = new Scanner(System.in);
//输入成绩,对单科成绩累加,对总成绩累加
for(i = 0;i < 3; i++)
{
for(j = 0;j < 4;j++){
System.out.print("请输入科目:" + course[i] + " 学生:" + name[j] + " 的成绩:");
stuScore[i][j] = input.nextInt(); //读取学生成绩
singleSum[i] = singleSum[i] + stuScore[i][j]; //单科成绩累加
}
allScore = allScore + singleSum[i]; //总成绩累加
}
for(i = 0;i < 3; i++)
{
System.out.println("科目:" + course[i] + "的平均成绩:" + singleSum[i] / 4.0);
}
System.out.println("总平均成绩:" + allScore / 12.0);
}
}