二维数组:就是元素为一维数组的一个数组。
格式1:(动态初始化,列固定)
数据类型[][] 数组名 = new 数据类型[m][n];
m:表示这个二维数组有多少个一维数组。
n:表示每一个一维数组的元素有多少个。
注意:
A:以下格式也可以表示二维数组
a:数据类型 数组名[][] = new 数据类型[m][n];
b:数据类型[] 数组名[] = new 数据类型[m][n];
B:注意下面定义的区别
int x; int[] x;
int y; int[] y[];
int x,y; int[] x,y[];(等价于定义一维数组x,定价二维数组y;)
class Array2Demo1 { public static void main(String[] args) { //定义一个二维数组 int[][] arr = new int[3][2]; //定义了一个二维数组arr //这个二维数组有3个一维数组的元素 //每一个一维数组有2个元素 //输出二维数组名称 System.out.println(arr); //地址值 [[I@1db9742 //输出二维数组的第一个元素一维数组的名称 System.out.println(arr[0]); //地址值 [I@106d69c System.out.println(arr[1]); //地址值 [I@52e922 System.out.println(arr[2]); //地址值 [I@25154f //输出二维数组的元素 System.out.println(arr[0][0]); //0 System.out.println(arr[0][1]); //0 } }
格式2:(动态初始化,列变化)
数据类型[][] 数组名 = new 数据类型[m][];
m:表示这个二维数组有多少个一维数组。
列数没有给出,可以动态的给。这一次是一个变化的列数。
class Array2Demo2 { public static void main(String[] args) { //定义一个二维数组 int[][] arr = new int[3][]; System.out.println(arr);//[[I@1db9742 System.out.println(arr[0]);//null System.out.println(arr[1]);//null System.out.println(arr[2]);//null //动态的为每一个一维数组分配空间 arr[0] = new int[2]; arr[1] = new int[3]; arr[2] = new int[1]; System.out.println(arr[0]);//[I@106d69c System.out.println(arr[1]);//[I@52e922 System.out.println(arr[2]);//[I@25154f System.out.println(arr[0][0]);//0 System.out.println(arr[0][1]);//0 //System.out.println(arr[0][2]); //错误:Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException arr[1][0] = 100; arr[1][2] = 200; } }
格式3:(静态初始化)
基本格式:
数据类型[][] 数组名 = new 数据类型[][]{{元素1,元素2…},{元素1,元素2…},{元素1,元素2…}};
简化版格式:
数据类型[][] 数组名 = {{元素1,元素2…},{元素1,元素2…},{元素1,元素2…}};
举例:
int[][] arr = {{1,2,3},{4,5,6},{7,8,9}};
int[][] arr = {{1,2,3},{4,5},{6}};
class Array2Demo3 { public static void main(String[] args) { //定义数组 int[][] arr = {{1,2,3},{4,5},{6}}; System.out.println(arr); System.out.println(arr[0]); System.out.println(arr[1]); System.out.println(arr[2]); System.out.println(arr[0][0]); //1 System.out.println(arr[1][0]); //4 System.out.println(arr[2][0]); //6 System.out.println(arr[0][1]); //2 System.out.println(arr[1][1]); //5 //越界 //System.out.println(arr[2][1]); //错误 } }
二维数组遍历:
外循环控制的是二维数组的长度,其实就是一维数组的个数。
内循环控制的是一维数组的长度。
class Array2Demo4 { public static void main(String[] args) { //定义一个二维数组 int[][] arr = {{1,2,3},{4,5,6},{7,8,9}}; //请问谁代表{1,2,3} //arr[0]就是第一个数组 //arr[0] = {1,2,3}; for(int x=0; x<arr[0].length; x++) { System.out.println(arr[0][x]); } System.out.println("--------------"); for(int x=0; x<arr[1].length; x++) { System.out.println(arr[1][x]); } System.out.println("--------------"); for(int x=0; x<arr[2].length; x++) { System.out.println(arr[2][x]); } System.out.println("--------------"); //用循环改进 for(int x=0; x<3; x++) { for(int y=0; y<arr[x].length; y++) { System.out.print(arr[x][y]+" "); } System.out.println(); } System.out.println("--------------"); //这个时候,3是我们根据上面的代码得出来的 //但是,它不能针对任何的数组都可以这样 //所以,我们应该想办法改进 //其实,外面的这个循环的长度就是二维数组的长度 for(int x=0; x<arr.length; x++) { for(int y=0; y<arr[x].length; y++) { System.out.print(arr[x][y]+" "); } System.out.println(); } System.out.println("--------------"); //用方法改进 //调用方法 printArray2(arr); System.out.println("--------------"); //我们再来一个列数是变化的 int[][] arr2 = {{1,2,3},{4},{5,6,7},{8,9}}; printArray2(arr2); } /* 需求:遍历二维数组 两个明确: 返回值类型:void 参数列表:int[][] arr */ public static void printArray2(int[][] arr) { for(int x=0; x<arr.length; x++) { for(int y=0; y<arr[x].length; y++) { System.out.print(arr[x][y]+" "); } System.out.println(); } } }
二维数组求和
需求:
公司年销售额求和,某公司按照季度和月份统计的数据如下:单位(万元)
第一季度:84,65,46
第二季度:73,35,97
第三季度:28,49,80
第四季度:15,55,93
分析:
A:把题目的数据用二维数组来表示
int[][] arr = {{84,65,46},{73,35,97},{28,49,80},{15,55,93}};
B:如何求和呢?
求和其实就是获取到每一个元素,然后累加即可。
C:定义一个求和变量sum,初始化值是0。
D:通过遍历就可以得到每一个二维数组的元素。
E:把元素累加即可。
F:最后输出sum,就是结果。
class Array2Demo5 { public static void main(String[] args) { //把题目的数据用二维数组来表示 int[][] arr = {{84,65,46},{73,35,97},{28,49,80},{15,55,93}}; //定义一个求和变量sum,初始化值是0。 int sum = 0; //通过遍历就可以得到每一个二维数组的元素。 for(int x=0; x<arr.length; x++) { for(int y=0; y<arr[x].length; y++) { //把元素累加即可。 sum += arr[x][y]; } } //最后输出sum,就是结果。 System.out.println("一年的销售额为:"+sum+"万元"); } }
Demo6:打印杨辉三角形(行数可以键盘录入)
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
分析:看这种图像的规律
A:任何一行的第一列和最后一列都是1
B:从第三行开始,每一个数据是它上一行的前一列和它上一行的本列之和。
步骤:
A:首先定义一个二维数组。行数如果是n,我们把列数也先定义为n。
这个n的数据来自于键盘录入。
B:给这个二维数组任何一行的第一列和最后一列赋值为1
C:按照规律给其他元素赋值
从第三行开始,每一个数据是它上一行的前一列和它上一行的本列之和。
D:遍历这个二维数组。
import java.util.Scanner; class Array2Demo6 { public static void main(String[] args) { //创建键盘录入对象 Scanner sc = new Scanner(System.in); //这个n的数据来自于键盘录入。 System.out.println("请输入一个数据:"); int n = sc.nextInt(); //定义二维数组 int[][] arr = new int[n][n]; //给这个二维数组任何一行的第一列和最后一列赋值为1 for(int x=0; x<arr.length; x++) { arr[x][0] = 1; //任何一行第1列 arr[x][x] = 1; //任何一行的最后1列 } //按照规律给其他元素赋值 //从第三行开始,每一个数据是它上一行的前一列和它上一行的本列之和。 for(int x=2; x<arr.length; x++) { //这里如果y<=x是有个小问题的,就是最后一列的问题 //所以这里要减去1 //并且y也应该从1开始,因为第一列也是有值了 for(int y=1; y<=x-1; y++) { //每一个数据是它上一行的前一列和它上一行的本列之和。 arr[x][y] = arr[x-1][y-1] + arr[x-1][y]; } } //遍历这个二维数组。 /* for(int x=0; x<arr.length; x++) { for(int y=0; y<arr[x].length; y++) { System.out.print(arr[x][y]+"\t"); } System.out.println(); } */ //这个时候,要注意了,内循环的变化必须和曾经讲过的九九乘法表类似 for(int x=0; x<arr.length; x++) { for(int y=0; y<=x; y++) { System.out.print(arr[x][y]+"\t"); } System.out.println(); } } }
Java中的参数传递规律:
基本类型:形式参数的改变对实际参数没有影响。
引用类型:形式参数的改变直接影响实际参数。
例如数组传递的是地址值,形参通过接收实参的地址改变数组元素的值后,相当于元素重新赋值。
class Demo7 { public static void main(String[] args) { int a = 10; int b = 20; System.out.println("a:"+a+",b:"+b); //a:10,b:20 change(a,b); System.out.println("a:"+a+",b:"+b); //???? a:10,b:20 int[] arr = {1,2,3,4,5}; change(arr); System.out.println(arr[3]); //???? 8 } public static void change(int a,int b) { //a=10,b=20 System.out.println("a:"+a+",b:"+b); //a:10,b:20 a = b; //a=20 b = a + b; //b=40 System.out.println("a:"+a+",b:"+b); //a:20,b:40 } public static void change(int[] arr) { //arr={1,2,3,4,5}; for(int x=0; x<arr.length; x++) { if(arr[x]%2==0) { arr[x]*=2; } } //arr={1,4,3,8,5}; } }