需求:将不必要的数据进行压缩以节省空间(如下图所示)
代码实现:
import java.util.Arrays;
/**
* @ClassName: SparseArray
* @Description:
* @Author: xuezhouyi
* @Version: V1.0
**/
public class SparseArray {
public static void main(String[] args) {
/* 构建左边的二维数组 */
int[][] oriArr = new int[9][9];
oriArr[3][3] = 1;
oriArr[3][4] = 2;
oriArr[3][5] = 3;
oriArr[4][3] = 8;
oriArr[4][5] = 4;
oriArr[5][3] = 7;
oriArr[5][4] = 6;
oriArr[5][5] = 5;
/* 打印原始数组 */
for (int[] ints : oriArr) {
System.out.println(Arrays.toString(ints));
}
/* 输出
[0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 1, 2, 3, 0, 0, 0]
[0, 0, 0, 8, 0, 4, 0, 0, 0]
[0, 0, 0, 7, 6, 5, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0]
* */
/* 获取有效元素个数 */
int count = 0;
for (int[] ints : oriArr) {
for (int anInt : ints) {
if (anInt != 0) count++;
}
}
System.out.printf("左边元素个数是:%d\n", count);
/* 输出
左边元素个数是:8
* */
/* 创建右边数组 */
int[][] sparseArr = new int[count + 1][3];
/* 写入第一组数据 */
sparseArr[0][0] = oriArr.length;
sparseArr[0][1] = oriArr.length;
sparseArr[0][2] = count;
/* 遍历原始数组并循环写入稀疏数组 */
int index = 0;
for (int i = 0; i < oriArr.length; i++) {
for (int j = 0; j < oriArr[i].length; j++) {
if (oriArr[i][j] != 0) {
index++;
sparseArr[index][0] = i;
sparseArr[index][1] = j;
sparseArr[index][2] = oriArr[i][j];
}
}
}
/* 打印稀疏数组 */
for (int[] ints : sparseArr) {
System.out.println(Arrays.toString(ints));
}
/* 输出
[9, 9, 8]
[3, 3, 1]
[3, 4, 2]
[3, 5, 3]
[4, 3, 8]
[4, 5, 4]
[5, 3, 7]
[5, 4, 6]
[5, 5, 5]
* */
/* 至此我们已经成功将数据进行了压缩,接着就来解压缩,首先创建一个新的二维数组 */
int[][] newArr = new int[sparseArr[0][0]][sparseArr[0][1]];
/* 给新的二维数组初始化,注意这里要从第二行开始 */
for (int i = 1; i <= sparseArr[0][2]; i++) {
newArr[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
}
/* 打印新数组 */
for (int[] ints : newArr) {
System.out.println(Arrays.toString(ints));
}
/* 输出
[0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 1, 2, 3, 0, 0, 0]
[0, 0, 0, 8, 0, 4, 0, 0, 0]
[0, 0, 0, 7, 6, 5, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0]
* */
}
}