应用场景
当在编写五子棋程序时
image.png
在一个11*11的五子棋棋局中,棋盘使用二维数组进行记录,那就需要定义一个11行11列的二维数组保存。
image.png问题分析:
因为该二维数组的很多值是默认值0,因此记录了很多没有意义的数据,而且浪费内存空间。
这个时候就可以使用稀疏数组。
基本介绍
当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组
稀疏数组处理方法:
image.png转换为 --->
image.png
1)记录数组一共有几行几列,有多少不同的值
2)把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模
代码实现
public class Sparse {
public static void main(String[] args) {
int [][] chessArr=new int[11][11];
chessArr[1][2]=1;
chessArr[2][3]=2;
System.out.println("原始数组~");
for (int[] row:chessArr){
for (int data:row){
System.out.printf("%d\t",data);
}
System.out.println();
}
image.png
//二维数组 ---->稀疏数组
// 首先遍历二维数组,获取二维数组有效值
int sum=0;
for (int i=0;i<11;i++){
for (int j=0;j<11;j++){
if (chessArr[i][j]!=0){
sum++;
}
}
}
System.out.println("二维数组----->稀疏数组~~~~~");
//创建一个稀疏数组行 sum+1,列为 3
int[][] sparseArr=new int[sum+1][3];
//将原来有效数据赋值给细稀疏数组
//稀疏数组第一行
sparseArr[0][0]=11;
sparseArr[0][1]=11;
sparseArr[0][2]=sum;
//将原来数组的有效数据赋值给稀疏数组的行列值
int count=0;
for(int i=1;i<11;i++){
for (int j=0;j<11;j++){
if (chessArr[i][j]!=0){
count++;
sparseArr[count][0]=j;
sparseArr[count][1]=j;
sparseArr[count][2]=chessArr[i][j];
}
}
}
//遍历输出稀疏数组
for (int i=0;i<sparseArr.length;i++){
for (int j=0;j<sparseArr[i].length;j++){
System.out.printf("%d\t", sparseArr[i][j]);
}
System.out.println();
}
image.png
//稀疏数组恢复原来二维数组
System.out.println("稀疏数组恢复成二维数组~~~~~");
/**
* 思路:
* 1. 先读取稀疏数组第一行,获取原来的二维数组的行和列,和有效数据
* 2. 再读取稀疏数组后几行,并复制给原始的二维数组即可
*/
int [][] chessArr2=new int[sparseArr[0][0]][sparseArr[0][1]];
for (int i=1;i<sparseArr.length;i++){
//读取稀疏数组后几行,将稀疏数组的 val列赋值
chessArr2[sparseArr[i][0]][sparseArr[i][1]]=sparseArr[i][2];
}
for (int [] row:chessArr2){
for (int data:row){
System.out.printf("%d\t",data);
}
System.out.println();
}
}
}
image.png
网友评论