没有原理讲解,仅记录一个实现代码,作为参考和笔记使用
如题,稀疏数组仅在原始数组有效数据较少的情况下起压缩空间的作用
实现过程:
首先为了方便查看和确认,封装一个打印二维数组的方法
public static void printArray(int[][] arrays) {
for (int[] array : arrays) {
for (int element : array) System.out.print(element + "\t");
System.out.println();
}
}
创建待压缩的原始数组
int[][] originArray = new int[11][11];
originArray[1][2] = 1;
originArray[2][3] = 2;
//输出原始数组
printArray(originArray);
原始数组长这样:
(
可见其中存在许多0元素,浪费了许多空间,可以通过创建稀疏数组来进行压缩。
创建稀疏数组:
//首先要获取原数组中有效数据的个数,用来确定稀疏数组的大小:
int sum = 0;
for (int i = 0; i < originArray.length; i++) {
for (int j = 0; j < originArray[0].length; j++) {
if (originArray[i][j] != 0) sum++;
}
}
//sum即为有效数据的个数,则稀疏数组总共有sum+1行,其中第一行存放数组尺寸和有效数据个数,后续行存放有效数据坐标和值
int[][] sparseArray = new int[sum + 1][3];
sparseArray[0][0] = originArray.length;
sparseArray[0][1] = originArray[0].length;
sparseArray[0][2] = sum;
//再次遍历原数组,记录有效数据的坐标和值
int sparseLine = 1; //标记稀疏数组的行号应从1开始,因为第"0"行用来记录数组尺寸了
for (int i = 0; i < originArray.length; i++) {
for (int j = 0; j < originArray[0].length; j++) {
if (originArray[i][j] != 0) {
sparseArray[sparseLine][0] = i;
sparseArray[sparseLine][1] = j;
sparseArray[sparseLine++][2] = originArray[i][j];
}
}
}
//至此,稀疏数组就创建完成了,打印看一下
printArray(sparseArray);
还原数组
根据稀疏数组中记录的数组信息和有效值信息,还原数组:
//首先,根据第"0"行的信息,创建跟原数组一样尺寸的数组
int[][] array3 = new int[sparseArray[0][0]][sparseArray[0][1]];
//从第"1"遍历稀疏数组,将记录的值还原到新数组
for (int i = 1; i < sparseArray.length; i++)
restoreArray[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2];
//打印看一下
printArray(restoreArray);
标签:sparseArray,int,稀疏,++,实例,数组,java,originArray
From: https://www.cnblogs.com/hiibird/p/17282843.html