稀疏数组作用:
数组中有很多无效数据,压缩数组。疏数组可以简单的看作为是压缩,在开发中也会使用到。比如将数据序列化到磁盘上,减少数据量,在IO过程中提高效率等等。
为什么要进行压缩?
由于稀疏矩阵中存在大量的“空”值,占据了大量的存储空间,而真正有用的数据却少之又少,且在计算时浪费资源,所以要进行压缩存储以节省存储空间和计算方便。
这里用一个小Demo来展示稀疏数组的作用,主要功能如下:
1、将二维数组转稀疏数组
2、将稀疏数组转回原始数组
3、将稀疏数组存到磁盘中
4、从磁盘中读取稀疏数组并将其转回二维数组
代码如下
public class SparseArray {
public static void main(String[] args) throws Exception {
//初始化二维数组
int[][] array = initArr();
System.out.println("---------> 二维数组转稀疏数组");
//初始化稀疏数组
int[][] sparseArray = initSparseArr(array);
System.out.println("----------->稀疏数组转回原始数组");
//将稀疏数组转回二维数组
returnInitArr(sparseArray);
/**
* 将稀疏数组存到磁盘中:
* 我们可以使用java的IO流将稀疏数组存放到磁盘中,原数组和稀疏数组比较,肯定是稀疏数组体积更小,占用空间更小
*/
saveSparseArray(sparseArray);
//从磁盘中读取稀疏数组
readSparseArray();
}
private static void returnInitArr(int[][] sparseArray) {
//初始化原二维数组
int[][] oldArray = new int[sparseArray[0][0]][sparseArray[0][1]];
//将原来非0的数填充回去
for (int i = 1; i <= sparseArray[0][2]; i++) {
oldArray[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2];
}
//遍历刚转回的原始数组
printMethod(oldArray);
}
private static int[][] initSparseArr(int[][] array) {
//得到非0数据的个数
int sum = 0;
for (int[] row : array) {
for (int item : row) {
if (item != 0) {
sum++;
}
}
}
//创建稀疏数组并给稀疏数组赋值
int[][] sparseArray = new int[sum + 1][3];
sparseArray[0][0] = array.length;
sparseArray[0][1] = array.length;
sparseArray[0][2] = sum;
//将非0的数放入稀疏数组;count:标识当前是第几个非0数
int count = 0;
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array.length; j++) {
if (array[i][j] != 0) {
count++;
sparseArray[count][0] = i;
sparseArray[count][1] = j;
sparseArray[count][2] = array[i][j];
}
}
}
//遍历稀疏数组
printMethod(sparseArray);
return sparseArray;
}
private static int[][] initArr() {
int[][] array = new int[11][11];
array[1][2] = 1;
array[2][4] = 2;
printMethod(array);
return array;
}
//一个用来遍历数组的方法
private static void printMethod(int[][] array) {
for (int[] row : array) {
for (int item : row) {
System.out.print(item + "\t");
}
System.out.println();
}
}
/**
* 从磁盘中读取稀疏数组
*
* @throws Exception
*/
private static void readSparseArray() throws Exception {
File file = new File("sparseArray.txt");
FileInputStream fis = new FileInputStream(file);
InputStreamReader reader = new InputStreamReader(fis, "utf-8");
StringBuffer sb = new StringBuffer();
while (reader.ready()) {
sb.append((char) reader.read());
}
reader.close();
fis.close();
//创建对应的稀疏数组
String[] str = sb.toString().split(",");
int[][] sparseArrHf = new int[str.length / 3][3];
//给稀疏数组赋值
int i = 0;
for (String s : str) {
sparseArrHf[i / 3][i % 3] = Integer.parseInt(s);
i++;
}
System.out.println("磁盘读取稀疏数组");
printMethod(sparseArrHf);
//将稀疏数组转回二维数组
System.out.println("将稀疏数组转回二维数组");
returnInitArr(sparseArrHf);
}
/**
* 将稀疏数组存入磁盘(文件)
* @param sparseArray
*/
private static void saveSparseArray(int[][] sparseArray) throws Exception {
File file = new File("sparseArray.txt");
FileOutputStream fos = new FileOutputStream(file);
OutputStreamWriter writer = new OutputStreamWriter(fos, "utf-8");
if (!file.exists()) {
file.createNewFile();
}
for (int[] row : sparseArray) {
for (int item : row) {
writer.write(item + ",");
}
}
writer.flush();
writer.close();
}
}