12:java学习笔记:多维数组1
1维数组是是一行数字的输出,那么多维数组就是行列等等的数字
(这里主要写2D array)
12.1什么是二维数组
二维数组根据一维数组建立的,一维数组是一行数据,但是二维数组是一个行一个是列进行的。二维数组 = 多行(每行是一个一维数组)所以是一维数组的进阶版
12.2二维数组的创建与初始化
12.2.1二维数组的创建
首先,得创建一个二维数组才能初始化。
import java.util.Scanner;
public class r4 {public static void main(String[] args) {// TODO Auto-generated method stubScanner input = new Scanner(System.in);String [][] grades = new String[5][5];
}}
这里建立了 二维数组,是一个的,这里前面的是行,后面的是列,是一个矩阵,当然在二维数组中,不一定需要行数等于列数的。
12.2.2二维数组的初始化
初始化二维数组有两个方法
12.2.2.1直接初始化赋值
int[][] weird = {{1, 2},{3, 4, 5},{6}
};
同样可以赋值,并且二维数组是不需要行列数相同的,随便都行。
12.2.2.2用户输入
二维数组可以让用户输入,但是需要通过for循环实现。在这里2维数组,两个维度,所以必须使用for嵌套才行。
for (int i = 0; i < matrix.length; i++) {for (int j = 0; j < matrix[i].length; j++) {System.out.print("请输入第 " + i + " 行第 " + j + " 列的值: ");matrix[i][j] = input.nextInt();}}
这个首先i是行数,然后j是列数,i很好理解每次i加一,然后i必须小于二维数组的长度才行。但是j的范围是比较奇怪的,j的范围是每一行的长度,每一行的长度就是列数,比如说第一行有4长度,那么列就是4长度。
然后用户可以输入自己想要输入的数字,从而写在对应的i,j中。
12.3二维数组的使用
同样还是一个增删改查的使用方法
和1维数组一样,无法增或者删,所以只写关于改于查的
12.3.1改
改与1维数组很像。
public class i {public static void main(String[] args) {// TODO Auto-generated method stubint[][] weird = {{1, 2},{3, 4, 5},{6}};weird[1][2] = 34;}}
直接写入你想要改的下标,(注意这里的1,2指的是第二行第三个数字改成34.)
下标还是从0开始,不管是行还是列都是这样。
12.3.2查
12.3.2.1长度查询
这里的长度查询是行的长度与列的长度查询,之前也写过了如何写行于列的长度,
matrix.length
行的长度(有几行),列的长度是每一行有多少个,便是列的长度
matrix[i].length
12.3.2.2遍历
这里的遍历选择使用for增强来写
在1维数组中,可以直接用一个for增强来遍历整个数组,但是在2维数组中需要使用两个for增强语句来写
第一步先把数组中的行分别保存到row中,然后再用1维数组的,把每一行的数字拿出来放到vol中
public class i {public static void main(String[] args) {// TODO Auto-generated method stubint[][] weird = {{1, 2},{3, 4, 5},{6}};weird[1][2] = 34;for(int[] row : weird) {for(int vol : row) {System.out.print(vol + " ");}System.out.println();}}}
然后最后打印每一个vol的值 然后呢 每一行中都需要空格,如果这一行循环结束,有System.out.println()来换行。
12.4二维数组的应用
二维数组通常应用在 表格登记价格,登记学生成绩,五子棋,围棋等等都需要使用到二维数组
这一篇中,写一个等级学生成绩的代码。
首先学习成绩的代码是一个表格,在表头中写号对应的
所以需要创建一个5*5的表格。并且需要把表头写好,因为表头不会改变,改变的下面的值
import java.util.Scanner;
public class r4 {public static void main(String[] args) {// TODO Auto-generated method stubScanner input = new Scanner(System.in);String [][] grades = new String[5][5];grades[0][0] = "学生";grades[0][1] = "数学";grades[0][2] = "英语";grades[0][3] = "物理";grades[0][4] = "语文";}
}
那么表头表示好后,因为需要用户输入,所以需要使用到for循环嵌套来进行
for(int i = 1;i<=grades.length-1;i++) {for(int j = 0;j<grades[i].length;j++) {
在这里i必须等于1因为第零行已经写完了(第零行是表头所以i需要从0改成1)
然后分析一下,表格有什么特殊性,第一列必须是名字,其他都是数字,然后呢第二列是数学成绩,第三行是英语成绩等等
所以这里就是分类讨论了,之前总结过,分裂讨论在代码中就是if语句,便可以写出来了
if(j==0) {System.out.println("第 " + i + " 个学生名字是 ?");grades[i][j] = input.next();}else if(j==1) {System.out.println("第 " + i + " 个同学的数学成绩是多少呢");grades[i][j] = input.next();}else if(j==2) {System.out.println("第 " + i + " 个同学的英语成绩是多少呢");grades[i][j] = input.next();}else if(j==3) {System.out.println("第 " + i + " 个同学的物理成绩是多少呢");grades[i][j] = input.next();}else if(j==4){System.out.println("第 " + i + " 个同学的语文成绩是多少呢");grades[i][j] = input.next();}
这里当然也可以写成switch-case-default的形式
然后呢 最后使用for增强进行遍历 然后打印出来
System.out.println("成绩的表格是 ");for(String [] row : grades) {for(String vol : row) {System.out.print(vol+ " ");}System.out.println();}
那么总的代码是
import java.util.Scanner;
public class r4 {public static void main(String[] args) {// TODO Auto-generated method stubScanner input = new Scanner(System.in);String [][] grades = new String[5][5];grades[0][0] = "学生";grades[0][1] = "数学";grades[0][2] = "英语";grades[0][3] = "物理";grades[0][4] = "语文";for(int i = 1;i<=grades.length-1;i++) {for(int j = 0;j<grades[i].length;j++) {if(j==0) {System.out.println("第 " + i + " 个学生名字是 ?");grades[i][j] = input.next();}else if(j==1) {System.out.println("第 " + i + " 个同学的数学成绩是多少呢");grades[i][j] = input.next();}else if(j==2) {System.out.println("第 " + i + " 个同学的英语成绩是多少呢");grades[i][j] = input.next();}else if(j==3) {System.out.println("第 " + i + " 个同学的物理成绩是多少呢");grades[i][j] = input.next();}else if(j==4){System.out.println("第 " + i + " 个同学的语文成绩是多少呢");grades[i][j] = input.next();}}}System.out.println("成绩的表格是 ");for(String [] row : grades) {for(String vol : row) {System.out.print(vol+ " ");}System.out.println();}}}
输出是