一.为什么要将二维数组转成稀疏数组
在这里我们以五子棋棋盘为例,一个8×8的棋盘对应一个列、行长度都为8的二维数组,白棋代表1,黑棋代表2,那么其他没下的地方默认值都为0,可以参考下图。
假设现在有这样一种场景,需要这盘五子棋下到一半,突然有事要出门,但是又希望把这一盘游戏保存下来。保存实现起来是很简单的,可以直接用到java的io流将棋盘(二维数组)暂时保存到文件中去,但是这个时候考虑一个问题,这么多个0重复,可以用一种什么样的数据结构来压缩二维数据呢,这个时候稀疏数组就起作用了。
将二维数组转成稀疏数组的图解如下:
稀疏数组的第一行表示的是二维数组的行长、列长、元素个数。
接下来的行表示元素在二维数组中具体的行、列、值。
二.二维数组转稀疏数组的代码实现
public class SparseArray {
public static void main(String[] args) {
//准备二维数据
int[][] twoArray = preparArr();
//打印方法
System.out.println("二维数组");
print(twoArray);
//拿到元素的个数
int num = getElementNum(twoArray);
//构造稀疏数组的二维长度,列长度固定为3,从左到右依次代表行、列、值,行长度为元素个数加1
int[][] sparseArr = new int[num + 1][3];
sparseArr[0][0] = twoArray.length;
sparseArr[0][1] = twoArray[0].length;
sparseArr[0][2] = num;
//从第2行开始记录
int row = 1;
for (int i = 0; i < twoArray.length; i++) {
int col = 0;
for (int j = 0; j < twoArray[0].length; j++) {
if(twoArray[i][j] != 0){
sparseArr[row][col] = i;
sparseArr[row][col+1] = j;
sparseArr[row][col+2] = twoArray[i][j];
row++;
}
}
}
System.out.println("-----------------");
System.out.println("稀疏数组");
print(sparseArr);
}
private static int[][] preparArr() {
int[][] twoArray = new int[5][5];
twoArray[0][2] = 3;
twoArray[1][3] = 4;
twoArray[2][4] = 5;
return twoArray;
}
public static void print(int[][] arr) {
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[0].length; j++) {
System.out.print(arr[i][j] + " ");
}
System.out.println();
}
}
public static int getElementNum(int[][] arr) {
int count = 0;
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[0].length; j++) {
if (arr[i][j] != 0) {
count++;
}
}
}
return count;
}
}