Java数据结构:原始二维数组与稀疏数组相互转换
基本介绍
当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组
如:
用原始二维数组表示:
- 这个数组需要保存:6 × 7 = 42 个数据
换成稀疏数组:
-
第 0 行表示原二维数组总共有 6 行,有 7 列,有 8 个非零数;
-
从第一行开始,就说明第几行,第几列的非零数字是多少;
-
稀疏数组总共要保存:9 × 3 = 27 个数据,这样就能减少内存的消耗
应用实例
一个 11 行,11 列的五子棋盘,我们用二维数组来表示这个五子棋盘,其中黑子所在位置我们标位 1,篮子所在位置标位 2,没有棋子的位置标位 0
可以看到,我们用原始二维数组,需要存储 11 * 11 = 121 个数据,用稀疏数组只需要存储 3 * 3 = 9 个数据,节省了很多内存
二维数组转稀疏数组的思路:
- 便利原始的二维数组,得到有效数据的个数 sum
- 根据 sum 就可以创建稀疏数组
sparseArr int[sum + 1][3]
- 将二维数组的有效数据存入到稀疏数组
- 将系数数组存入磁盘
稀疏数组转原始数组的思路:
- 从磁盘读取出稀疏数组
- 读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组,比如上面的
chessArr2 = int[11][11]
- 再读取稀疏数组后几行的数据,并赋给原始的二维数组即可
代码实现
import java.util.Arrays;
public class SparseArray {
public static void main(String[] args) {
// 创建也给原始的二维数组 11 * 11
// 0:表示没有棋子:1:表示黑子;2:表示篮子
int[][] chessArr1 = new int[11][11];
chessArr1[1][2] = 1; // 第一行第二列有一个黑子(每行、每列从零开始计数)
chessArr1[2][3] = 2; // 第二行第三列有一个篮子
// 输出原始的二维数组
System.out.println("原始的二维数组:");
for (int[] ints : chessArr1) {
System.out.println(Arrays.toString(ints));
}
// 将原始二维数组转成稀疏数组
// 1、先遍历原始二维数组,得到非零数据个数
int sum = 0;
for (int[] ints : chessArr1) {
for (int anInt : ints) {
if (anInt != 0) sum ++;
}
}
// 创建稀疏数组
int[][] sparseArr = new int[sum + 1][3];
// 给稀疏数组赋值
sparseArr[0][0] = chessArr1.length; // 原始二维数组的行数
sparseArr[0][1] = chessArr1[0].length; // 原始二维数组的列数
sparseArr[0][2] = sum; // 原始二维数组非零数据个数
// 遍历原始二维数据,将非零值存入稀疏数组中去
int count = 0; // count 用于记录是第几个非零数据
for (int i = 0; i < chessArr1.length; i++) {
for (int j = 0; j < chessArr1[0].length; j++) {
if (chessArr1[i][j] != 0) {
count++;
sparseArr[count][0] = i;
sparseArr[count][1] = j;
sparseArr[count][2] = chessArr1[i][j];
}
}
}
// 输出稀疏数组
System.out.println("稀疏数组:");
for (int[] ints : sparseArr) {
System.out.println(Arrays.toString(ints));
}
// 将稀疏数组恢复成原始二维数组
// 读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组
int[][] chessArr2 = new int[sparseArr[0][0]][sparseArr[0][1]];
// 再读取稀疏数组后几行的数据,并赋给原始的二维数组即可
for (int i = 1; i < sparseArr.length; i++) {
chessArr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
}
// 输出恢复后的原始二维数组
System.out.println("恢复后的原始二维数组:");
for (int[] ints : chessArr2) {
System.out.println(Arrays.toString(ints));
}
}
}
输出: