还原稀疏数组时数组越界
在练习Java稀疏数组的的时候碰到了数组越界的问题。
练习内容:
- 创建一个二维数组
- 将二维数组转化为稀疏数组
- 再将稀疏数组转换成二维数组
下面是全部代码
public class ArrayDemo6 {
public static void main(String[] args) {
//需求:编写五子棋游戏中,有存盘退出和续上盘的功能
//稀疏数组
//1.创建一个二维数组 11*11 0代表没有棋子,1代表黑子,2代表白子
int[][] array1 = new int[11][11];
array1[1][2] = 1;
array1[2][3] = 2;
//输出原始的数组
System.out.println("输出原始数组");
for (int[] ints : array1) {
for (int anInt : ints) {
System.out.print(anInt+"\t");
}
System.out.println();
}
System.out.println("===================================================");
//转换为稀疏数组
//获取有效值的个数
int sum = 0;
for (int i = 0; i < 11; i++) {
for (int j = 0; j < 11; j++) {
if (array1[i][j]!=0){
sum++;
}
}
}
System.out.println("有效值的个数:"+sum);
//2.创建一个稀疏数组
int[][] array2 = new int[sum+1][3];
array2[0][0] = 11;//原数组有多少行
array2[0][1] = 11;//原数组有多少列
array2[0][2] = sum;//原数组有几个有效值
//遍历二维数组,将非零的值存放到稀疏数组中
int count = 0;//行
for (int i = 0; i < array1.length; i++) {
for (int j = 0; j < array1[i].length; j++) {//先进行遍历
if (array1[i][j] != 0){
count++;//由于第0行已经存放数据了,就要从第1行开始放数据
array2[count][0] = i;//二维数组不为零数的行值
array2[count][1] = j;//二维数组不为零数的列值
array2[count][2] = array1[i][j];//二维数组不为零的数
}
}
}
//输出稀疏数组
System.out.println("输出稀疏数组");
for (int[] ints : array2) {
for (int anInt : ints) {
System.out.print(anInt+"\t");
}
System.out.println();
}
System.out.println("===================================================");
//还原稀疏数组
System.out.println("还原稀疏数组");
//1.读取稀疏数组
int[][] array3 = new int[array2[0][0]][array2[0][1]];//稀疏数组[0][0]和[0][1]存放的分别是原数组的行和列
//2.给其中的元素还原他的值
for (int i = 0; i < array2.length; i++) {
array3[array2[i][0]][array2[i][1]] = array2[i][2];//将稀疏数组第三列的数赋给二维数组的指定位置
// 二维数组的行 二维数组的列 二维数组的值
}
//3.还原
for (int[] ints : array3) {
for (int anInt : ints) {
System.out.print(anInt+" ");
}
System.out.println();
}
}
}
下面为运行结果
可以看到在还原稀疏数组操作时出现了ArrayIndexOutOfBoundsException报错,代表数组越界了,分析还原数组的代码
//1.读取稀疏数组
int[][] array3 = new int[array2[0][0]][array2[0][1]];//稀疏数组[0][0]和[0][1]存放的分别是原数组的行和列
//2.给其中的元素还原他的值
for (int i = 0; i < array2.length; i++) {
array3[array2[i][0]][array2[i][1]] = array2[i][2];//将稀疏数组第三列的数赋给二维数组的指定位置
// 二维数组的行 二维数组的列 二维数组的值
}
//3.还原
for (int[] ints : array3) {
for (int anInt : ints) {
System.out.print(anInt+" ");
}
System.out.println();
}
稀疏数组是:将一个大多数数据是0的二维数组转化为一个描述这个二维数组中不为0的数据的二维数组。(自己理解的,很拗口啊)
举个例子:
0 0 0 0
0 1 0 0
0 0 2 0
0 0 0 0
上面是一个4*4的二维数组,将他转化为稀疏数组
4 4 2 意思是原来的二维数组是4行4列,有2个不为零的元素
1 1 1 第一个不为零的元素在第1行第1列,数据为1
2 2 2 第二个不为零的元素为第2行第2列,数据为2
所以稀疏数组只有3列
回到报错代码,既然提示数组越界,那么就是还原数组时的赋值出现问题了,检查第6行语句,代码写的是将稀疏数组中的值作为要还原的二维数组的行列和元素值,查看for循环,在第一轮循环时i=0,进入循环,稀疏数组【0】【0】的值为原来二维数组的行值,【0】【1】为原来二维数组的列值,按照原代码看就是11和11。
但在还原数组功能的开头我们写了创建一个11*11的二维数组,这个11指的是数组长度,而在数组下标中就是0-10,所以在赋值时无法赋给【11】【11】,就会造成数组越界。
如何处理?
将i=0改为i=1即可,因为稀疏数组是从第1行开始记录不为零数据的。