多维数据的使用(二)
动态初始化
如果二维数组的每一个数据,甚至是每一行的列数,需要后期单独确定,那么就只能使用动态初始化方式了。动态初始化方式分为两种格式:
格式1:规则二维表:每一行的列数是相同的
//(1)确定行数和列数 元素的数据类型[][] 二维数组名 = new 元素的数据类型[m][n]; //其中,m:表示这个二维数组有多少个一维数组。或者说一共二维表有几行 //其中,n:表示每一个一维数组的元素有多少个。或者说每一行共有一个单元格 //此时创建完数组,行数、列数确定,而且元素也都有默认值 //(2)再为元素赋新值
二维数组名[行下标][列下标] = 值;
举例:
int[][] arr = new int[3][2];
- 定义了名称为arr的二维数组
- 二维数组中有3个一维数组
- 每一个一维数组中有2个元素
- 一维数组的名称分别为arr[0], arr[1], arr[2]
- 给第一个一维数组1脚标位赋值为78写法是:arr[0][1] = 78;
格式2:不规则:每一行的列数不一样
//(1)先确定总行数 元素的数据类型[][] 二维数组名 = new 元素的数据类型[总行数][]; //此时只是确定了总行数,每一行里面现在是null //(2)再确定每一行的列数,创建每一行的一维数组 二维数组名[行下标] = new 元素的数据类型[该行的总列数]; //此时已经new完的行的元素就有默认值了,没有new的行还是null //(3)再为元素赋值 二维数组名[行下标][列下标] = 值;
举例:
int[][] arr = new int[3][];
- 二维数组中有3个一维数组。
- 每个一维数组都是默认初始化值null (注意:区别于格式1)
- 可以对这个三个一维数组分别进行初始化:arr[0] = new int[3]; arr[1] = new int[1]; arr[2] = new int[2];
- 注:int[][]arr = new int[][3]; //非法
练习
public static void test2WAr() { int[][] arr = new int[5][];//确定行,不确定列 //确定列 for (int i = 0; i < arr.length; i++) { /* arr[0] 的列数是1 arr[1] 的列数是2 arr[2] 的列数是3 arr[3] 的列数是4 arr[4] 的列数是5 */ arr[i] = new int[i + 1]; } //确定元素值 for (int i = 0; i < arr.length; i++) { for (int j = 0; j < arr[i].length; j++) { arr[i][j] = i + 1; } } //遍历 for (int i = 0; i < arr.length; i++) { for (int j = 0; j < arr[i].length; j++) { System.out.print(arr[i][j] + " "); } System.out.println(); } }
运行效果
1 2 2 3 3 3 4 4 4 4 5 5 5 5 5
数组的长度和角标
二维数组的长度/行数:二维数组名.length
二维数组的某一行:二维数组名[行下标],此时相当于获取其中一组数据。它本质上是一个一维数组。行下标的范围:[0, 二维数组名.length-1]。此时把二维数组看成一维数组的话,元素是行对象。
某一行的列数:二维数组名[行下标].length,因为二维数组的每一行是一个一维数组。
某一个元素:二维数组名[行下标][列下标],即先确定行/组,再确定列。
int[][] scores = { {85, 96, 85, 75}, {99, 96, 74, 72, 75}, {52, 42, 56, 75} }; System.out.println(scores); //地址值 System.out.println("一共有 " + scores.length + " 数组组成!!"); //长度 System.out.println(scores[0]); //地址值 System.out.println(scores[1]); //地址值 System.out.println(scores[2]); //地址值 System.out.println("第一组有 " + scores[0].length + " 个元素"); System.out.println("第二组有 " + scores[1].length + " 个元素"); System.out.println("第三组有 " + scores[2].length + " 个元素"); // System.out.println("第四组有 " + scores[4].length+ " 个元素");ArrayIndexOutOfBoundsException System.out.println(scores[0][0]); System.out.println(scores[0][1]); System.out.println(scores[0][2]); System.out.println(scores[0][3]);
二维数组的遍历
格式:
for(int i=0; i<二维数组名.length; i++){ //二维数组对象.length for(int j=0; j<二维数组名[i].length; j++){//二维数组行对象.length System.out.print(二维数组名[i][j]); } System.out.println(); }
举例:
System.out.println("一共有" + scores.length + "组成绩."); for (int i = 0; i < scores.length; i++) { System.out.println("第" +( i + 1) + "组有 " + scores[i].length + " 个元素:"); for (int j = 0; j < scores[i].length; j++) { System.out.print(scores[i][j] + "\t"); } System.out.println(); }