稀疏数组是将原二维数组中的大部分相同的元素进行压缩,记录特殊数的信息,已达到节约内存、提高程序的运行速度。
第一行存放的是原数组的行数、列数以及特殊数的个数。
第二行至最后一行存放的是特殊数在原数组中所在的行数、列数以及数值。
public class SparseArray {
public static void main(String[] args) {
// 创建一个原始的二维数组 [5][5]
// 0: 表示没有棋子, 1 :黑子 2 :白子
int[][] chessArr = new int[5][5];
chessArr[1][2] = 1;
chessArr[2][3] = 2;
chessArr[4][4] = 2;
System.out.println("原始的二维数组:");
for (int[] row : chessArr) {
for (int data : row) {
System.out.printf("%d\t", data);
}
System.out.println();
}
// 将二维数组 转 稀疏数组
// 1. 先遍历二维数组 得到非0数据的个数
int sum = 0;
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
if (chessArr[i][j] != 0) {
sum++;
}
}
}
//2. 创建稀疏数组
int[][] sparseArr = new int[sum + 1][3];
//给稀疏数组赋值
sparseArr[0][0] = 5;
sparseArr[0][1] = 5;
sparseArr[0][2] = sum;
int n = 0;
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
if (chessArr[i][j] != 0) {
n++;
sparseArr[n][0] = i;
sparseArr[n][1] = j;
sparseArr[n][2] = chessArr[i][j];
}
}
}
System.out.println("转化成稀疏数组:");
for (int[] row : sparseArr) {
for (int data : row) {
System.out.printf("%d\t", data);
}
System.out.println();
}
//将稀疏数组 恢复成 原始的二维数组
//1. 先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组
int[][] array = new int[sparseArr[0][0]][sparseArr[0][1]];
//2. 在读取稀疏数组后几行的数据,并赋给 原始的二维数组 即可
for (int i = 1; i < sparseArr.length; i++) {
array[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
}
System.out.println("稀疏数组转成二维数组:");
for (int[] row : array) {
for (int data : row) {
System.out.printf("%d\t", data);
}
System.out.println();
}
}
}
运行结果:
原始的二维数组:
0 0 0 0 0
0 0 1 0 0
0 0 0 2 0
0 0 0 0 0
0 0 0 0 2
转化成稀疏数组:
5 5 3
1 2 1
2 3 2
4 4 2
稀疏数组转成二维数组:
0 0 0 0 0
0 0 1 0 0
0 0 0 2 0
0 0 0 0 0
0 0 0 0 2
进程完成,退出码 0