4.3 二维数组

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

4.3.1 二维数组简介

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

数据类型[][]  数组名;或  数据类型 数组名[][];

数组名 = new 数据类型[第一维长度] [第二维长度];
copy

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

int[][] arr = new int[3][4];
copy

  在直观上看,上面的例子就是定义了一个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]
copy

  二维数组本质是一维数组,其中这个一维数组的每个元素都是引用类型,分别指向不同的一维数组,其内存结构和之前介绍的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\}\};//初始化一个32列的整型二维数组

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

  其中数组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.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);

    }

}
copy