当一个数组中大部分元素为0 或者为同一个值的数组时,可以使用稀疏数组来保存该数组
处理方法:
1.记录数组一共有几行几列,有多少个不同的值
2.把不同值的元素的行、列、值记录在另一个数组中,从而缩小程序的规模
注:把一个数组转换成稀疏数组并保存到.data文件 ,再读取.data文件恢复把稀疏数组恢复为原数组
import java.io.BufferedOutputStream;
import java.io.BufferedWriter;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class App {
public static void main(String[] args) throws IOException {
// 原数组
int[][] i = new int[7][7];
i[1][3] = 1;
i[3][4] = 2;
i[3][3] = 2;
i[2][2] = 1;
i[0][0] = 1;
System.out.println("原数组");
for (int[] js : i) {
for (int j : js) {
System.out.print(j + " ");
}
System.out.println();
}
// 记录原数组有多少个数据
int num = 0;
for (int j = 0; j < i.length; j++) {
for (int j2 = 0; j2 < i[0].length; j2++) {
if (i[j][j2] != 0) {
num++;
}
}
}
System.out.println("有效数据");
System.out.println(num);
// 用于行的自增长
int count = 1;
// 稀疏数组
int[][] ii = new int[num + 1][3];
ii[0][0] = i.length;
ii[0][1] = i[0].length;
ii[0][2] = num;
for (int j = 0; j < i.length; j++) {
for (int j2 = 0; j2 < i[0].length; j2++) {
if (i[j][j2] != 0) {
ii[count][0] = j;
ii[count][1] = j2;
ii[count++][2] = i[j][j2];
}
}
}
// 输出到文件 q.data
FileOutputStream out = new FileOutputStream("d://q.data");
System.out.println("稀疏数组");
for (int[] js : ii) {
for (int js2 : js) {
System.out.print(js2 + " ");
out.write(js2);
}
System.out.println();
}
out.close();
// 读取文件 q.data文件
FileInputStream in = new FileInputStream("d://q.data");
int row;
// 恢复数组 第一个值为行,第二个值为列
int iii[][] = new int[in.read()][in.read()];
// 第三个为有多少个有效数据
in.read();
int column;
int value;
// 开始遍历恢复(每三个一组)
while ((row = in.read()) != -1) {
column = in.read();
value = in.read();
iii[row][column] = value;
}
in.close();
System.out.println("恢复的数组");
for (int[] js : iii) {
for (int js2 : js) {
System.out.print(js2 + " ");
}
System.out.println();
}
}
}
输出:
原数组
1 0 0 0 0 0 0
0 0 0 1 0 0 0
0 0 1 0 0 0 0
0 0 0 2 2 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
有效数据
5
稀疏数组
7 7 5
0 0 1
1 3 1
2 2 1
3 3 2
3 4 2
恢复的数组
1 0 0 0 0 0 0
0 0 0 1 0 0 0
0 0 1 0 0 0 0
0 0 0 2 2 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0