今天学习了数组中的一种-叫做稀疏数组。
什么叫稀疏数组呢?
如果一个数组(包括多维数组)中的大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组,节约空间。
一般来说,稀疏数组的处理方法是:
1.记录数组一共有几行几列,有多少个不同的数值。
2.把具有不同值的元素的行列及记录在一个小规模的数组中,从而缩小程序的规模。
如图所示,一般来说,第一行存取几行几列以及几个数值。
image.png
应用:
- 可以使用稀疏数组来保留类似前面的二维数组(棋盘,地图等)
2.把稀疏数组存盘,并且可以重新恢复原来的二维数组数。
下面将使用一个例子,结合来构建稀疏数组。
在编写的五子棋程序中,有存盘和续上盘的功能。
image.png
由于此时,棋盘中的棋子的坐标符合大多数元素为0的情况,所以我们可以构建一个稀疏数组来表示这道题。
那么我们可以得到二维数组转稀疏数组的思路
- 遍历二维数组,得到有效个数sum。
- 根据sum就可以创建稀疏数组sparseArr int[sum+1][3]
- 将二维数组的有效数据存入稀疏数组。
稀疏数组转原始的二维数组思路:
- 先读取稀疏数组的第一行,根据第一行数据,创建原始的二维数组。
- 在读取稀疏数组后几行的数据,并赋给原始的二维数组即可。
public class SparsearrayTest {
public static void main(String[] args) {
//创建一个原始的二维数组。
//0代表没有棋子 1.代表黑子 2.蓝子
int[][] chessArr1 = new int[11][11];
chessArr1[1][2]=1;
chessArr1[2][5]=1;
chessArr1[3][2]=2;
chessArr1[5][4]=1;
chessArr1[4][5]=2;
//输出原始的二位数组
System.out.println("原始的二维数组为:");
Arrays.stream(chessArr1).forEach(x -> {
Arrays.stream(x).forEach(System.out::print);
System.out.println();
}
);
//将二维数组转化为稀疏数组
//1,先遍历二维数组,得到非0的数据个数
int sum=0;
// Arrays.stream(chessArr1).forEach(x -> { Arrays.stream(x).filter(y -> y!=0).sum(); });
for(int i=0;i<11;i++){
for(int j=0;j<11;j++){
if(chessArr1[i][j]!=0){
sum++;
}
}
}
System.out.println("有效值个数为:"+sum);
//2创建对应的稀疏数组
int[][] sparseArr = new int[sum + 1][3];
sparseArr[0][0]=11;
sparseArr[0][1]=11;
sparseArr[0][2]=sum;
//3.遍历二维数组,将非0的值存放到sparseArr
//记录第几个非0的数据
int count=0;
for(int i=0;i<11;i++) {
for (int j = 0; j < 11; j++) {
if (chessArr1[i][j] != 0) {
count++;
sparseArr[count][0] = i;
sparseArr[count][1] = j;
sparseArr[count][2] = chessArr1[i][j];
}
}
}
//输出稀疏数组的形式
System.out.println("");
System.out.println("稀疏数组形式为-----");
for(int z=0;z<sparseArr.length;z++){
System.out.println(sparseArr[z][0]+" "+sparseArr[z][1]+" "+sparseArr[z][2]);
}
//将稀疏数组-》转化成原始的二维数组
/**
* 1.先读取第一行,根据第一行的数据,创建原始的二位数据,比如上面的chessArr2=int[11][11]
*
* 2.在读取稀疏数组后几行的数据,并赋给原始的二维数组
*/
int[][] chessArry2 = new int[sparseArr[0][0]][sparseArr[0][1]];
for(int z=1;z<sparseArr.length;z++){
chessArry2[sparseArr[z][0]][sparseArr[z][1]]=sparseArr[z][2];
}
//输出恢复后的二维数组
Arrays.stream(chessArry2).forEach(x -> {
Arrays.stream(x).forEach(System.out::print);
System.out.println();
}
);
}
}
结合例子可以更好的理解哦。
感谢您阅读我的文章,如果满意可以帮我点歌赞,谢谢哈。
如果对文章部分还有什么见解或者疑惑,可以私信评论我,欢迎技术讨论。如果需要获取完整的文件资源,可以加我微信z985085305,获取我整理的全套笔记。
思想的碰撞最能促进技术的进步哦。
网友评论