我的上一篇文章中已经讲述了如何将一个大部分元素都相同的二维数组,转为稀疏数组,但是还差一部分,一般原始的二维数组转为稀疏数组之后我们会对其进行存盘操作,也就是利用io流将稀疏数组写入到磁盘中,存为一个实体对象,下次使用的时候直接对文件进行读取复原。
写代码之前我们先来分析一些思路:
1.遍历稀疏数组,将稀疏数组的每一行作为一个整体写入
2.每一行要进行换行,方便读取之后的复原,为了好看也可以每个具体的元素加上一个退格符
3.读取之后根据之间的换行符将读取得到的字符串转为字符串数组
思路分析完了,下面我们来写代码:
public void method() {
//定义一个原始数组
int[][] original = new int[5][5];
int count = 0;//记录原始数组的有效值
//赋值
original[1][1] = 1;
original[2][3] = 2;
original[3][3] = 3;
//遍历原始数组
System.out.println("原始数组********************");
for (int[] item : original) {
for (int i : item) {
System.out.print(i + "\t");
if (i != 0)//在遍历的时候顺便记录一下稀疏数组的有效值
count++;
}
System.out.println();
}
//创建对应的稀疏数组,数组的行是count+1,列都是定义为3
int[][] sparse = new int[count + 1][3];
//稀疏数组的第一行记录的是原始数组的行,列,已经有多少个有效数据
sparse[0][0] = original.length;
sparse[0][1] = original[0].length;
sparse[0][2] = count;
//然后获取原始数组的有效数据的行,列,以及值为多少,使用循环遍历
count = 1;//现在将count作为一个计算器使用
for (int i = 0; i < original.length; i++) {
for (int j = 0; j < original[i].length; j++) {
if (original[i][j] != 0) {
//记录进稀疏数组
sparse[count][0] = i;
sparse[count][1] = j;
sparse[count++][2] = original[i][j];
}
}
}
System.out.println("开始写入....");
//将稀疏数组写入文件中
try (FileWriter file = new FileWriter("稀疏数组1.txt")){
for (int[] item : sparse) {
for (int i : item) {
file.write(i+"\t");
}
file.write("\n");
}
file.flush();
}catch (IOException e) {
e.printStackTrace();
}
System.out.println("写入完成....");
//读取文件
System.out.println("开始读取....");
String str = null;
try (FileReader data = new FileReader("稀疏数组1.txt")){
//准备数组接收数据
char[] chars = new char[1024];
int read = data.read(chars);
str = new String(chars,0,read);
System.out.println(str);
} catch (IOException e) {
e.printStackTrace();
}
//稀疏数组复原成为原始数组
//转为一个字符串数组
String[] split = null;
if (str != null){
//将退格符符进行替换,然后按换行符进行截取转为一个只有4个元素的一维字符串数组
split = str.replace("\t", "").split("\n");
}
int row = Integer.parseInt(String.valueOf(split[0].charAt(0)));
int line = Integer.parseInt(String.valueOf(split[0].charAt(1)));
int val = 0;
//复原之后的原始数组
int[][] renew = new int[row][line];
for (int i = 1; i < split.length; i++) {
row = Integer.parseInt(String.valueOf(split[i].charAt(0)));
line = Integer.parseInt(String.valueOf(split[i].charAt(1)));
val = Integer.parseInt(String.valueOf(split[i].charAt(2)));
renew[row][line] = val;
}
//打印复原之后的数组
System.out.println("从磁盘读取的稀疏数组复原之后的原始数组");
for (int[] item : renew) {
for (int i : item) {
System.out.print(i + "\t");
}
System.out.println();
}
}
注意在写入磁盘的操作的时候,不能直接将int类型的数据直接写入,因为它会自动的转为一个char类型,写入之后就会乱码,要在后面+"",或者价格退格符
以上就是稀疏数组进行存盘,如何从文件中读取的复原成为原始数组的操作