一、概述
可以将此类当成一个工具类来使用,此类提供正常数组转为稀疏数组和把稀疏数组恢复为二维数组两个静态方法
应用场景:用于压缩数大数组中出现大量重复数据的数组压缩,可以节省空间
二、代码实现
/**
* 稀疏数组
* 可以当一个工具类来用,提供原始数组转稀疏数组和稀疏数组恢复成原始数组两个方法
* 应用场景:可以压缩大数组(有很多重复值的)
* @date 2021/10/11 22:47
*/
public class SparseArray {
//todo 1.原始数组转稀疏数组
public static int[][] normalArrayToSparseArray(int[][] normalArray){
// 1. 先遍历二维数组 得到非0数据的个数
int sum = 0;
for (int i = 0; i < 11; i++) {
for (int j = 0; j < 11; j++) {
if (normalArray[i][j] != 0) {
sum++;
}
}
}
// 2. 创建对应的稀疏数组
int sparseArr[][] = new int[sum + 1][3];
// 给稀疏数组赋值
sparseArr[0][0] = 11;
sparseArr[0][1] = 11;
sparseArr[0][2] = sum;
// 3. 遍历二维数组,将非0的值存放到 sparseArr中
int count = 0; //count 用于记录是第几个非0数据
for (int i = 0; i < 11; i++) {
for (int j = 0; j < 11; j++) {
if (normalArray[i][j] != 0) {
count++;
sparseArr[count][0] = i;
sparseArr[count][1] = j;
sparseArr[count][2] = normalArray[i][j];
}
}
}
return sparseArr;
}
//todo 2.稀疏数组恢复成原始数组
public static int[][] sparseArrayToNormalArray(int[][] sparseArray){
//1. 先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组
int normalArray[][] = new int[sparseArray[0][0]][sparseArray[0][1]];
//2. 在读取稀疏数组后几行的数据(从第二行开始),并赋给 原始的二维数组 即可
for(int i = 1; i < sparseArray.length; i++) {
normalArray[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2];
}
return normalArray;
}
public static void main(String[] args) {
// 创建一个原始的二维数组 11 * 11
// 0: 表示没有棋子, 1 表示 黑子 2 表蓝子
int chessArr1[][] = new int[11][11];
chessArr1[1][2] = 1;
chessArr1[2][3] = 2;
chessArr1[4][5] = 2;
System.out.println("========原始数组========");
printArray(chessArr1);
System.out.println("========原始数组========");
System.out.println("========稀疏数组========");
int[][] sparseArray = normalArrayToSparseArray(chessArr1);
printArray(sparseArray);
System.out.println("========稀疏数组========");
System.out.println("========恢复的原始数组========");
int[][] normalArray = sparseArrayToNormalArray(sparseArray);
printArray(normalArray);
System.out.println("========恢复的原始数组========");
}
// 输出二维数组
private static void printArray(int[][] array){
for (int[] row : array) {
for (int data : row) {
System.out.printf("%d\t", data);
}
System.out.println();
}
}
}