基本介绍
当二维数组大部分元素为0或大部分值相同的情况下,我们可以用稀疏数组来储存。
处理方法
1.记录下数组有几行几列,以及多少个不同的值
2.把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模。
应用场景
在五子棋的棋盘中,除了黑白子其余地方都是空的,可以用稀疏数组来存储。
思路
二维数组转稀疏数组的思路
1.遍历原始的二维数组,得到有效值元素的个数sum;
2.根据sum去创建二维稀疏数组sum行3列;
3.将二维数组有效数据存入稀疏数组中
稀疏数组转二维数组的思路
1.先读取稀疏数组第一行的数据,根据第一行的数据创建二维数组
2.读取稀疏数组第一行外的数据,循环遍历进行赋值
代码实现
package day11;
public class Test01 {
public static void main(String[] args) {
int[][] arr1 = new int[11][11];//原始二维数组
arr1[1][2] = 1;//有效数据
arr1[2][3] = 2;//有效数据
for(int i = 0; i < 11; i++) {
//打印原始数组
for(int j = 0; j < 11; j++) {
System.out.print(arr1[i][j] + "\t");
}
System.out.println();
}
System.out.println();//换两行以便区分
System.out.println();
int sum = 0;
for(int i = 0; i < 11; i++) {
for(int j = 0; j < 11; j++) {
if(arr1[i][j]!=0) {
sum++;//遍历得出有效数据总数
}
}
}
int flag = 0;
int[][] sa = new int[sum+1][3];
sa[0][0] = arr1.length;
sa[0][1] = arr1[0].length;
sa[0][2] = sum;
for(int i = 0; i < 11; i++) {
for(int j = 0; j < 11; j++) {
if(arr1[i][j]!=0) {
flag++;//稀疏数组赋值
sa[flag][0] = i;
sa[flag][1] = j;
sa[flag][2] = arr1[i][j];
}
}
}
for(int i = 0; i < sa.length; i++) {
//打印二维数组
for(int j = 0; j < sa[i].length; j++) {
System.out.print(sa[i][j] + "\t");
}
System.out.println();
}
System.out.println();//换行区分
System.out.println();
int[][] arr2 = new int[sa[0][0]][sa[0][1]];
for(int i = 1; i < sa.length; i++) {
//还原
arr2[sa[i][0]][sa[i][1]] = sa[i][2];
}
for(int i = 0; i < 11; i++) {
//打印
for(int j = 0; j < 11; j++) {
System.out.print(arr2[i][j] + "\t");
}
System.out.println();
}
}
}
写在最后
今天超梦开开心心地完成了项目三,非常开心,所以趁着不困把稀疏数组的博客更了,下一篇将会是烦恼了我好久的项目三~