二维数组就是“数组的数组”:保存N个一维数组,二维数组的每个数组元素的长度都不要求相同
二维数组的保存
二维数组通过int[][] array {{1,2,3},{11,21,31,41,51},{33,44,55,66,77,88,99},{0,0}};来保存数组
二维数组的输出
- 直接打印二维数组,输出二维数组的类型和内存地址
- Arrays.toString()方法,输出二维数组中每个一维数组的类型和内存地址
- Arrays.deepToString()方法,输出二维数组的所有元素数据
- 二维数组的长度:该二维数组中所包括的一维数组的个数
- 通过一个下标,访问二维数组中的指定一维数组
- 通过2个下标,访问二维数组中的指定元素(指定一维数组的指定下标元素)
import java.util.Arrays;
public class Test {
public static void main(String[] args) {
//一维数组:保存1组数据
int[] arr1 = {1,2,3,4};
int[] arr2 = {11,21,31,41,51};
int[] arr3 = {13,15,16,23,25,27};
System.out.println(arr1);
//二维数组:保存N组数据(每组数据都是一个一维数组)
int[][] array = {
{1,2,3,4},
{11,21,31,41,51},
{13,15,16,23,25,27},
{33,44,55,66,77,88,99},
{0,0}
};
System.out.println("二维数组的类型和内存地址:"+array);
System.out.println("二维数组的所有一维数组:"+Arrays.toString(array));
System.out.println("二维数组的所有元素数据:"+Arrays.deepToString(array));
System.out.println("二维数组的长度:"+array.length);
System.out.println("二维数组的头数组:"+Arrays.toString(array[0]));
System.out.println("二维数组的头数组中的头元素:"+array[0][0]);
}
}
运行结果:
[I@5e265ba4
二维数组的类型和内存地址:[[I@156643d4
二维数组的所有一维数组:[[I@123a439b, [I@7de26db8, [I@1175e2db, [I@36aa7bc2, [I@76ccd017]
二维数组的所有元素数据:[[1, 2, 3, 4], [11, 21, 31, 41, 51], [13, 15, 16, 23, 25, 27], [33, 44, 55, 66, 77, 88, 99], [0, 0]]
二维数组的长度:5
二维数组的头数组:[1, 2, 3, 4]
二维数组的头数组中的头元素:1
二维数组的遍历
和一维数组一样使用for循环或者foreach进行遍历
import java.util.Arrays;
public class Test {
public static void main(String[] args) {
//遍历二维数组
int[][] array = {
{1,2,3,4},
{11,21,31,41,51},
{13,15,16,23,25,27},
{33,44,55,66,77,88,99},
{0,0}
};
//方式1:使用下标
for(int i = 0;i < array.length;i++) {
for(int k = 0;k <array[i].length;k++) {
System.out.print(array[i][k]+"\t");
}
}
System.out.println();
//方式2:使用foreach
for(int[] ns: array) {
for(int n : ns) {
System.out.print(n+"\t");
}
System.out.println();
}
}
}
运行结果:
1 2 3 4 11 21 31 41 51 13 15 16 23 25 27 33 44 55 66 77 88 99 0 0
1 2 3 4
11 21 31 41 51
13 15 16 23 25 27
33 44 55 66 77 88 99
0 0
例题:随机位置存储1个H,2个S,3个X,其余位置填充O,生成该二维数组中的值
解:创建一个二维数组;打乱9次(k不止控制打乱的次数);打乱ns数组,将打乱后的数组存入一个新的us数组中,并循环放入map的第i行;遍历的输出这个二维数组
import java.util.Arrays;
public class Test11 {
public static void main(String[] args) {
char[][] map = new char[9][9];
for (int k = 0; k < 9; k++) {
char[] ns = {'H', 'S', 'S', 'X', 'X', 'X', 'O', 'O', 'O'};
for (int i = ns.length - 1; i > 0; i--) {
int index = (int) (Math.random() * i);
ns[index] = (char) (ns[index] ^ ns[i]);
ns[i] = (char) (ns[index] ^ ns[i]);
ns[index] = (char) (ns[index] ^ ns[i]);
}
//将打乱后的数组存入一个新的us数组中,并循环放入map的第i行
char[] us = new char[9];
System.arraycopy(ns, 0, us, 0, us.length);
map[k] = us;
}
//遍历的输出这个二维数组
for (char[] chs : map) {
for (char c : chs) {
System.out.printf(c + "\t");
}
System.out.println();
}
}
}
运行结果:
X X O S O X S O H
S S O X O O X X H
X H O O S O S X X
X X O O O S X H S
X O O S S H X O X
O X S O X H S O X
S O X X X O S O H
O X O H S S O X X
X O H O S X X O S