概念(文末有详细的代码演示)
- 当一个数组中大部分元素为0,或者为同一值的数组时,可以使用稀疏数组来保存该数组。
- 稀疏数组的处理方式是:记录数组一共有几行几列,有多少个不同值;把具有不同值的元素和行列及值记录在一个小规模的数组中,从而缩小程序的规模
- 如下图:左边是原始数组,右边是稀疏数组
实现步骤:
1.先遍历原始二维数组
①: 首先创建一个二维数组,定义黑子白子和无子
②: 将有数据的位置在二维数组中赋值
③: 输出含数据的二维数组
④: 输出含数据的二维数组(两层for增强: 外层读行,内层读列)
Ⅰ:二维 -> 稀疏
ps:因事先不清楚该二维数组中有几个有效数据
①:先遍历二维数组,得到非0个数
②: 定义一个sum,记录有效数据的个数(在遍历过程中,非0数据时 累加1)、
int sparseArr [ ] [ ] =new int [ sum + 1] [ 3];
③: 创建对应的稀疏数组
稀疏数组的第一行值: 多少行,多少列,几个有效数据(先前定义的sum)
④: 有效数据的所在位置是递增的,此处需要一个计数器,随着稀疏数组的循环次数增
Ⅱ:稀疏 -> 二维
①:先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组
②: 在读取稀疏数组的后几行数据,并赋给原始的二维数组即可。
代码实现如下:
public class SparyArrayTest {
public static void main(String[] args) {
//1. 先遍历原始二维数组
//① 首先创建一个二维数组,定义黑白子和五子
//0 无子 1 黑子 2 白子
int chessArr[][] = new int[11][11];
chessArr[1][2] = 1;
chessArr[2][3] = 2;
chessArr[4][6] = 2;
chessArr[5][5] = 2;
chessArr[4][1] = 1;
//② 将有效数据的位置在二维数组中赋值
//③ 输出含数据的二维数组
System.out.println("原始的二维数组~~~");
//两层for增强 外层读行值,内层读列值
for (int[] row : chessArr) {
for (int data : row) {
System.out.printf("%d\t", data);
}
System.out.println();
}
// TODO 19:37 2022/10/5 :将二维数组 转换为 稀疏数组 的思想
/*
因为事先不清楚该 二维数组有多少 有效数据
1.先遍历二维数组,得到非0个数
2.定义一个 sum 记录非0有效数据的个数
如果二维数组中有不为0的数据,sum 累加 1
最后在循环外输出sum,即有效数据的个数
*/
int sum = 0;
for (int i = 0; i < chessArr.length; i++) {
for (int j = 0; j < chessArr.length; j++) {
if (chessArr[i][j] != 0) {
sum++;
}
}
}
System.out.println("sum:" + sum);
// TODO 19:53 2022/10/5 : 2.创建对应的稀疏数组
/*
新建一个二维稀疏数组 int sparseArr[][] = new int[sum + 1][3];
[sum+1]: 行数 由有效数据决定 +1 是指第一行的统计数据(多少行,多少列,几个值)
[3]: 列数 稀疏数组的固定列数 3列
a.给第一行赋值
b.将二维数组中的非0数据存放在稀疏数组中,遍历二维数组
*/
int sparseArr[][] = new int[sum + 1][3];
//a.给第一行赋值
sparseArr[0][0] = 11;
sparseArr[0][1] = 11;
sparseArr[0][2] = sum;
//b.将二维数组中的非0数据存放在稀疏数组中,遍历二维数组
int count = 0;//用于记录是第几个非0数据
for (int i = 0; i < chessArr.length; i++) {
for (int j = 0; j < chessArr.length; j++) {
if (chessArr[i][j] != 0) {
/*
11 11 2
1 2 1
2 3 2
*/
count++;
sparseArr[count][0] = i;//第n行第一个 就是第一行的值
sparseArr[count][1] = j;//第n行第二个 列值
sparseArr[count][2] = chessArr[i][j];//第n行第三个 它本身
}
}
}
//输出稀疏数组的形式
System.out.println();
System.out.println("得到的稀疏数组为:---");
for (int i = 0; i < sparseArr.length; i++) {
System.out.printf("%d\t%d\t%d\t\n", sparseArr[i][0], sparseArr[i][1], sparseArr[i][2]);
}
System.out.println("================");
//稀疏数组转原始的二维数组的思路
/*
1. 先读取稀疏数组的第一行,根据第一行的数据,
创建原始的二维数组,比如上面的 chessArr2 = int [11][11]
2. 在读取稀疏数组后几行的数据,并赋给 原始的二维数组 即可.
*/
//1. 先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组,比如上面的 chessArr2 = int [11][11]
//稀疏数组的第一行的第一列就是Arr2的行
//稀疏数组的第一行的第二列就是Arr2的列
int chessArr2[][] = new int[sparseArr[0][0]] [sparseArr[0][1]];
// 2. 在读取稀疏数组后几行的数据(第二行开始),并赋给 原始的二维数组
for (int i = 1; i < sparseArr.length; i++) {
chessArr2[sparseArr[i][0]] [sparseArr[i][1]]=sparseArr[i][2];
}
//输出恢复后的二维数组
System.out.println();
for (int[] row : chessArr2) {
for (int data : row) {
System.out.printf("%d\t", data);
}
System.out.println();
}
}
}