说明
二维数组本质上是以数组作为数组元素的数组,即
数组的数组
。二维数组又称为矩阵,行列数相等的矩阵称为方阵。对称矩阵a[i][j] = a[j][i],对角矩阵:n阶方阵主对角线外都是零元素。
如何去理解数组中的数组呢?
二维数组的0下标,中存放了一个数组,1,2,下标亦是如此,这整个大的数组就是一个二维数组。这时小伙伴们应该会有疑问,既然数组中可以存放数组,那可不可以有三维数组?答案是 有的!,不过通常来讲二维数组已经足够满足我们开发需求了。
不会java8的可以先看我之前写过的一篇文章:JDK都出到16了,8还没有掌握吗?一篇文章打包带走Java8新特性
语法
- 语法与初始化方法基本与普通数组一样。
1.定义一个二维数组:类型 数组名[常量表达式][常量表达式] int arr [][]
2.静态初始化:类型 数组名 = {{元素1,元素2…},{元素1,元素2…},{元素1,元素2…}…}; int arr[][]={{1,2,3,4,5},{1,2,3,4,5},{1,2,3,4,5}};
3.动态初始化:类型 数组名 = new 类型 [行][列] int arr [][] = new int [11][11];
了解完语法之后我们在回到上面那张图,清楚的可以看出这是一个三行五列的二维数组。那么问题又来了,这样结构的数组我要怎么给它里面放值呢?
1.想要往里面放值我们首先结合上方语法定义第一个三行五列的二维数组并输出到控制台。
public static void main(String[] args) { int arr [][] = new int[3][5]; Arrays.stream(arr).forEach(arrs-> { Arrays.stream(arrs).forEach(a-> System.out.printf("%d\t",a)); System.out.println(); }); }
- 输出后我们可以清晰的看出来,它的行和列对应的值,既然定义如此赋值也当如此,下面我们给第三行第二列赋值为5。
int arr [][] = new int[3][5]; arr[2][1]=5; Arrays.stream(arr).forEach(arrs-> { Arrays.stream(arrs).forEach(a-> System.out.printf("%d\t",a)); System.out.println(); });
注意:别忘了数组的下标从0开始!
案例
- 二维数组求和
public static void main(String[] args) { int [][] arr ={{1,2},{1,2,3},{1,2,3,4}}; //求和 int sum=0; for (int i=0;i<arr.length;i++){ for (int j=0;j<arr[i].length;j++){ sum+=arr[i][j]; } } System.out.println(sum); }
这样看起来很不直观,没有关系,我们来分析一下循环体,第一次进入循环 i 为 0,j 也为 0 我们可以通过 arr[i][j] 拿到第0行第0列的值,为1,第二次循环我们 i 依旧为 0 但是我们的 j 为 1 ,我们再次通过 arr[i][j] 可以拿到第 0行第 1 列的值为 2 ,因为我们二维数组的第 0 行的数组就两个值,接下来我们要遍历第 1 行数据了,此时我们的 i 为 1 因为重新进入循环体了 j 也会从 0 开始 j 既然等于 0 我们会得到第 1 行第 0 列的值,为 1 以此类推并相加,我们就拿到最终的结果了。
- 能够使用二维数组存储班上三个学生两门功课的考试成绩并求出每个学生总分,平均分,最高分,最低分。
初始化一个三行两列的二维数组。
public static void main(String[] args) { //初始化一个二维数组 int student[][] =new int[3][2]; student[0][0]=60; student[0][1]=80; student[1][0]=90; student[1][1]=79; student[2][0]=80; student[2][1]=50; //每个学生总分 getSum(student); //每个学生平均分 getAvg(student); //每个学生的最高分 getMax(student); //每个学生的最低分 getMin(student); }
每个学生的课程总分
public static int [] getSum(int[][] student){ int[] studentSum=new int[student.length]; for (int i=0;i<student.length;i++){ int sum=0; for (int j=0;j<student[i].length;j++){ sum+=student[i][j]; } studentSum[i]=sum; } return studentSum; }
每个学生的课程平均分
public static int [] getAvg(int[][] student){ int[] studentAvg=new int[student.length]; for (int i=0;i<student.length;i++){ int age=0; for (int j=0;j<student[i].length;j++){ age+=student[i][j]; } studentAvg[i]=age/student[i].length; } return studentAvg; }
每个学生的课程最高分
public static int [] getMax(int[][] student){ int[] studentMax=new int[student.length]; for (int i=0;i<student.length;i++){ int max = student[i][0]; for (int j=0;j<student[i].length;j++){ if (max<student[i][j]){ max=student[i][j]; } } studentMax[i]=max; } return studentMax; }
每个学生的课程最低分
public static int [] getMin(int[][] student){ int[] studentMin=new int[student.length]; for (int i=0;i<student.length;i++){ int min = student[i][0]; for (int j=0;j<student[i].length;j++){ if (min>student[i][j]){ min=student[i][j]; } } studentMin[i]=min; } return studentMin; }