当我们遇到一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组,可以节省下来很多空间。
这样一个二维数组如果想转换成稀疏数组,我们需要知道这几个值,
1、原二维数组的行数和列数
2、原二维数组一共有多少个不同的值
稀疏数组固定只有三列 他的行数就是不同值+1 列数就是3
第一行永远都是 行数 列数 不同值的数量
第二行就是第一个不等于0的值的坐标 以及具体值
第三行就是第二个不等于0的值的坐标 以及具体值
以此类推.......
二维数组转稀疏数组的思路
1、遍历原二维数组,得到有效数据的个数sum
2、根据sum就可以创建稀疏数组int sparseArr[][] = new int[sum + 1][3]
3、将二维教组的有效数据数据存入到稀疏数组
稀疏数组转原始的二维数组的思路
1、先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组,比如上面的 newcheckerboard=int[11][11]
2、在读取稀疏数组后几行的数据,并赋给原始的二维数组即可
代码如下:
public static void main(String[] args) {
//创建二维数组
int checkerboard[][] = new int[11][11];
checkerboard[1][2] = 1;
checkerboard[2][3] = 2;
System.out.println("原始的二维数组");
for (int[] row : checkerboard) {//遍历没行
for (int data : row) {//遍历每行具体的值
System.out.print(data + " ");
}
System.out.println();
}
//有效数据的个数
int rownum = 0;
int count = 0;
int sum = 0;
for (int[] row : checkerboard) {
rownum++;
for (int data : row) {
if (data != 0) {
sum++;
}
count++;
}
}
int sortnum = count / rownum;
//创建稀疏数组
int sparseArr[][] = new int[sum + 1][3];
sparseArr[0][0] = rownum;
sparseArr[0][1] = sortnum;
sparseArr[0][2] = sum;
int flag = 1;//第几个有效数据
//转换稀疏数组
for (int i = 1; i < rownum; i++) {
for (int j = 0; j < sortnum; j++) {
if (checkerboard[i][j] != 0) {
sparseArr[flag][0] = i;
sparseArr[flag][1] = j;
sparseArr[flag][2] = checkerboard[i][j];
flag++;
}
}
}
//输出稀疏数组
System.out.println("二维数组转稀疏数组");
for (int[] row : sparseArr) { //遍历每行
for (int data : row) { //遍历每行具体的值
System.out.print(data + " ");
}
System.out.println();
}
//还原二维数组
int newflag=1;
int newcheckerboard [][]=new int[sparseArr[0][0]][sparseArr[0][1]];
for (int i = 1; i < sum+1; i++) {
newcheckerboard[sparseArr[newflag][0]][sparseArr[newflag][1]]
=sparseArr[newflag][2];
newflag++;
}
//遍历还原的二维数组
System.out.println("还原的二维数组");
for (int[] row : newcheckerboard) {//遍历没行
for (int data : row) {//遍历每行具体的值
System.out.print(data + " ");
}
System.out.println();
}
}
运行结果如下: