4.3 二维数组

  前面介绍的数组只有一个维度,称为一维数组,其数组元素也只有一个下标变量。在实际问题中有很多情况是二维或多维的,Java语言允许构造多维数组存储多维数据。多维数组的数组元素有多个下标,以标识它在数组中的位置。编程中,经常会用到二维数组,更高维度的数组在实际编程中很少使用,所以这里仅介绍二维数组。

4.3.1 二维数组简介

  声明并创建二维数组的语法形式如下。

  1. 数据类型[][] 数组名;或 数据类型 数组名[][];
  2. 数组名 = new 数据类型[第一维长度] [第二维长度];

  在创建的时候,可以同时设置第一维长度和第二维长度,也可以只设置第一维长度,但不可以只设置第二维长度。例如:

  1. int[][] arr = new int[3][4];

  在直观上看,上面的例子就是定义了一个3行4列的二维数组,数组名为arr。该数组的下标变量共有12(3×4)个,即:

  1. arr [0][0], arr [0][1], arr [0][2], arr [0][3]
  2. arr [1][0], arr [1][1], arr [1][2], arr [1][3]
  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],这一点和一维数组类似,需要注意数组下标越界的问题。

  同一维数组一样,二维数组在创建的时候也可以初始化,例如:

  1. int[][] arr1= \{\{2,3},{1,5},{3,9\}\};//初始化一个3行2列的整型二维数组
  2. int[][] arr2= \{\{1,2,3},{1,5},{3,9\}\};//初始化一个3行的整型二维数组

  其中数组arr2第一行有3个元素,第二和第三行有2个元素,对于这类每行元素数不同的二维数组,在使用时尤其需要注意数组下标越界的问题。

4.3.2 二维数组的使用

  接下来完成一个案例:某学习小组有4个学生,每个学生有3门课的考试成绩,如表4.1所示。求各科目的平均成绩和总平均成绩。

表4.1 学生成绩表
科目\姓名 王云 刘静涛 南天华 雷静
Java基础 77 65 91 84
前端技术 56 71 88 79
后端技术 80 81 85 66

  程序运行结果如图4.12所示,具体代码如下。

4.3 二维数组 - 图1
图4.12 二维数组的应用
  1. import java.util.Scanner;
  2. class Test2Array
  3. {
  4. public static void main(String[] args)
  5. {
  6. int i = 0;
  7. int j = 0;
  8. String[] course = {"Java基础","前端技术","后端技术"};
  9. String[] name = {"王云","刘静涛","南天华","雷静"};
  10. int[][] stuScore = new int[3][4]; //存放所有学生各科成绩
  11. int[] singleSum = new int[]{0,0,0}; //存放各科成绩的和
  12. int allScore = 0; //存放总成绩
  13. Scanner input = new Scanner(System.in);
  14. //输入成绩,对单科成绩累加,对总成绩累加
  15. for(i = 0;i < 3; i++)
  16. {
  17. for(j = 0;j < 4;j++){
  18. System.out.print("请输入科目:" + course[i] + " 学生:" + name[j] + " 的成绩:");
  19. stuScore[i][j] = input.nextInt(); //读取学生成绩
  20. singleSum[i] = singleSum[i] + stuScore[i][j]; //单科成绩累加
  21. }
  22. allScore = allScore + singleSum[i]; //总成绩累加
  23. }
  24. for(i = 0;i < 3; i++)
  25. {
  26. System.out.println("科目:" + course[i] + "的平均成绩:" + singleSum[i] / 4.0);
  27. }
  28. System.out.println("总平均成绩:" + allScore / 12.0);
  29. }
  30. }