什么是稀疏数组
当一个数组大部分元素为0,或者为同一个值的数组时,可以使用稀释数组来保存该数组。
稀疏数组有什么作用
五子棋相信大家都玩过吧!那么下面就以五子棋为列子跟大家谈谈稀疏数组的作用。那么大家有没有想过五子棋是如何进行保存的磁盘中的呢?又是如何从磁盘中读取呢?这个我想大家都会想到二维数组。确实使用二维数组可以,但这样会造成内存资源的浪费。不妨,我们来看一下稀疏数组的能给我们二维数组减少多少的内存浪费。给个思路分析图,让你一目了然。如下图:
二维数组转化为稀疏数组&稀疏数组恢复为原来的二维数组
import java.util.ArrayList;
import java.util.List;
public class SparseArray {
public static void main(String[] args) {
//创建一个原始的二维数组
// 0:表示没有棋子 1:表示黑子 2:表示蓝子
int[][] chessArr1 = new int[11][11];
chessArr1[1][2] = 1;
chessArr1[2][3] = 2;
//输出原始的二维数组
System.out.println("原始的二维数组:");
for (int i = 0; i < chessArr1.length; i++) {
for (int j = 0; j < chessArr1[0].length; j++) {
System.out.printf("%d\t",chessArr1[i][j]);
}
System.out.println();
}
System.out.println();
//将 二维数组 转化为 稀疏数组
/**
* 1.遍历 原始的二维数组,得到有效数据的个数sum
* 2.根据sum就可以创建 稀疏数组sparseArr[sum+1][3]
* 3.将二维数组的有效数据存放到 稀疏数组
*/
//1.先遍历二维数组,得到非零数据的个数
int sum = 0;
for (int i = 0; i < chessArr1.length; i++) {
for (int j = 0; j < chessArr1[0].length; j++) {
if(chessArr1[i][j] != 0){
sum++;
}
}
}
//2.创建对应的稀疏数组
int[][] sparseArr = new int[sum+1][3];
//3. 给稀疏数组赋值
sparseArr[0][0] = chessArr1.length;
sparseArr[0][1] = chessArr1[0].length;
sparseArr[0][2] = sum;
//遍历二维数组,把非零的值存放到稀疏数组sparseArr中
int count = 0; //count用于记录是第几个非零数据
for (int i = 0; i < chessArr1.length; i++) {
for (int j = 0; j < chessArr1[0].length; j++) {
if(chessArr1[i][j] != 0){
count++;
sparseArr[count][0] = i;
sparseArr[count][1] = j;
sparseArr[count][2] = chessArr1[i][j];
}
}
}
//输出稀疏数组
System.out.println("稀疏数组:");
for (int i = 0; i < sparseArr.length; i++) {
System.out.printf("%d\t%d\t%d\t",sparseArr[i][0],sparseArr[i][1],sparseArr[i][2]);
System.out.println();
}
System.out.println();
//将稀疏数组恢复成原始的二维数组
/**
* 1.先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组,比如上面的 chessArr1=int[11][11]
* 2.再读取稀疏数组后几行的数据,并赋值给原始的二维数组即可
*/
//1.先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组,
int[][] chessArr2 = new int[sparseArr[0][0]][sparseArr[0][1]];
//2.再读取稀疏数组后几行的数据,并赋值给原始的二维数组即可
int target = 1;
for(int[] num : sparseArr){
if(target == 1){
target++;
continue;
}
chessArr2[num[0]][num[1]] = num[2];
}
//输出恢复后的二维数组
System.out.println("恢复后的二维数组:");
for (int i = 0; i < chessArr2.length; i++) {
for (int j = 0; j < chessArr2[0].length; j++) {
System.out.printf("%d\t",chessArr2[i][j]);
}
System.out.println();
}
}
}
运行效果: