1.为什么要用稀疏数组?
面对于含有大量相同数据的数组,可以通过稀疏数组的形式来压缩数组.
- 原数组中存在大量的无效数据,占据了大量的存储空间,真正有用的数据却少之又少
- 压缩存储可以节省存储空间以避免资源的不必要的浪费,在数据序列化到磁盘时,压缩存储可以提高IO效率
原数组
0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0
0 0 0 0 2 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 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 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 0 0 0 0
稀疏数组形式
11 11 2
1 2 1
2 4 2
arr[0] [0] 表示原来的数据总行数 arr[0] [1] 表示总列数 arr[0] [2] 表示有效数据总个数
arr[1] [0] 表示第一个有效数据所在的行数
arr[1] [1] 表示第一个有效数据所在的列数
arr[1] [2] 表示第一个有效数据的值
下面的以此类推
也就是说稀疏数组的第一行表示原数组的大小 和有效数据的个数,其他的表示有效数据所在的位置和值
2.代码实现
2.1.创建稀疏数组并写入数据
//1.首先得到原数组的有效数据的个数
int sum = 0;
for (int[] rows : FirstArray) {
for (int row : rows) {
if (row != 0) {
sum++;
}
}
}
//2.1创建稀疏数组
int spareArray[][] = new int[sum + 1][3];
spareArray[0][0] = 5;
spareArray[0][1] = 5;
spareArray[0][2] = sum;
//2.2把有效数据写进去
int count = 1;
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
if (FirstArray[i][j] != 0) {
spareArray[count][0] = i;
spareArray[count][1] = j;
spareArray[count][2] = FirstArray[i][j];
count++;
}
}
}
2.2将稀疏数组写入磁盘文件中
/*
* @Author: yxc
* @date: 2020/2/23 15:10
* @Description 稀疏数组写进磁盘文件
* @parm [sparseArray]
* @return void
*/
public static void sparseArrayOutput(int[][] sparseArray) throws Exception {
FileOutputStream fos = new FileOutputStream("F:\\IDEAWorkSpace\\JavaStudy\\src\\AMyself\\SparseArrayDemo.txt");
BufferedOutputStream bos = new BufferedOutputStream(fos);
for (int i = 0; i < sparseArray.length; i++) {
for (int j = 0; j < 3; j++) {
String content = String.valueOf(sparseArray[i][j]);
bos.write(content.getBytes(), 0, content.getBytes().length);
}
}
bos.flush();
bos.close();
}
2.3 接下来从磁盘中读取稀疏数组
/*
* @Author: yxc
* @date: 2020/2/23 16:22
* @Description 把稀疏数组从磁盘文件中读取出来
* @parm []
* @return int[][]
*/
public static int[][] sparseArrayIntput() throws Exception {
FileInputStream fis = new FileInputStream("F:\\IDEAWorkSpace\\JavaStudy\\src\\AMyself\\SparseArrayDemo.txt");
byte[] buffer = new byte[10240];
int flag = 0;
int[][] sparseArray = new int[3][3];
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
//单个读取
if (flag != -1) {
flag = fis.read();
int data = Integer.parseInt(String.valueOf((char) flag));
sparseArray[i][j] = data;
}
}
}
return sparseArray;
}
2.4 将读取到的稀疏数组还原
try {
//接收读取到的稀疏数组
int[][] sparseArrayIntput;
sparseArrayIntput = sparseArrayIntput();
//查看读取出来的数组
//openF(sparseArrayIntput);
//5.还原出原数组
int chessArr2[][] = new int[sparseArrayIntput[0][0]][sparseArrayIntput[0][1]];
for (int i = 1; i < sparseArrayIntput.length; i++) {
chessArr2[sparseArrayIntput[i][0]][sparseArrayIntput[i][1]] = sparseArrayIntput[i][2];
}
openF(chessArr2);
} catch (Exception e) {
e.printStackTrace();
}
}
### 3.效果截图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SAUVbKPs-1582894062795)(https://raw.githubusercontent.com/yuanxuanchao/clouding/master/img/稀疏数组.png)]