稀疏数组
- 当一个数组中大部分元素为0,或为同一值的数组时,可以用稀疏数组来保存该数组。
- 稀疏数组的处理方式是:
-
- 记录数组有几行几列
-
- 把具有不同值的元素和行列及值记录在一个小规模的数组中,从而缩小程序的规模。
package com.array;
public class ArrayDemo08 {
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();
}
}
}