题目
将一个稀疏数组保存到磁盘上,命名为map.data。
再从磁盘读取map.data中的稀疏数组,将其恢复成原始的二维数组。
代码
import java.io.*;
import java.util.ArrayList;
import java.util.List;
public class Test01 {
public static void main(String[] args) {
//1.生成二维数组
int[][] a1 = new int[10][10];
a1[1][2] = 2;
a1[2][4] = 1;
//2.打印原始二维数据
System.out.println("原始的二维数组如下:");
for(int[] arr : a1) {
for (int num : arr) {
System.out.printf("%d\t", num); //注意此处!
}
System.out.println();
}
//3.先遍历二维数据,得到非零数据的个数
int sum = 0;
for(int i = 0; i < 10; i++){
for(int j = 0; j < 10; j++){
if(a1[i][j]!=0){
sum++;
}
}
}
//4.创建对应的稀疏矩阵
int [][] a2 = new int[sum+1][3];
a2[0][0] = 10;
a2[0][1] = 10;
a2[0][2] = sum;
//5.遍历二维数组,将非零的值存放到稀疏矩阵a2中
int count = 0; //记录第几个数据
for(int i = 0; i < 10; i++){
for(int j = 0; j < 10; j++){
if(a1[i][j]!=0){
count++;
a2[count][0] = i;
a2[count][1] = j;
a2[count][2] = a1[i][j];
}
}
}
//6.输出对应的稀疏矩阵
System.out.println("对应的稀疏矩阵如下:");
for(int[] arr : a2) {
for (int num : arr) {
System.out.printf("%d\t", num); //注意此处!
}
System.out.println();
}
//7.将稀疏数组写入文件中,文件名为map.data
File file = new File("e:\\map.data");
FileWriter writer = null;
try {
//转换流
writer = new FileWriter(file);
for (int i = 0; i < a2.length; i++) {
writer.append(a2[i][0]+"\t"+a2[i][1]+"\t"+a2[i][2]+"\n");
}
System.out.println("写入成功");
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
//7.从磁盘上读取map.data中的稀疏数组
List<String> lists =new ArrayList<>();
int[][] a3;
try {
FileReader reader = new FileReader(file);
BufferedReader bufferedReader = new BufferedReader(reader);
//按行读取数据再分割
String line;
while((line = bufferedReader.readLine()) != null){
lists.add(line);
}
String[] contents = lists.get(0).split("\t");
a3 =new int[Integer.parseInt(contents[2])+1][3];
a3[0][0] = Integer.parseInt(contents[0]);
a3[0][1] = Integer.parseInt(contents[1]);
a3[0][2] = Integer.parseInt(contents[2]);
for (int i = 1; i < lists.size(); i++) {
contents = (lists.get(i)).split("\t");
a3[i][0] = Integer.parseInt(contents[0]);
a3[i][1] = Integer.parseInt(contents[1]);
a3[i][2] = Integer.parseInt(contents[2]);
}
//8.输出读取的稀疏矩阵
System.out.println("从磁盘中读取的稀疏矩阵:");
for(int[] arr : a3) {
for (int num : arr) {
System.out.printf("%d\t", num);
}
System.out.println();
}
//9.将稀疏矩阵恢复成原始的二维数组
int[][] a4 = new int[a3[0][0]][a3[0][1]];
for(int i = 1; i<a3.length;i++){
a4[a3[i][0]][a3[i][1]] = a3[i][2];
}
System.out.println("恢复后的二维数组:");
for(int[] arr : a4) {
for (int num : arr) {
System.out.printf("%d\t", num);
}
System.out.println();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
看到网上的另一种解法:
while (reader.ready()) {
sb.append((char) reader.read());// 转成char加到StringBuffer对象中
}
System.out.println(sb.toString()); //将StringBuffer -> String输出
//split("\\s+") 按空格,制表符,等进行拆分
//也就是说它是按空白部分进行拆分,不管这个空白是什么,例如空格键 tab键
String[] str =sb.toString().split("\\s+");
int count = 0;
//str.length/3 理解:一行三个元素,算出有多少行
int[][] spareArray = new int[str.length/3 ][3];
for (String s : str) {
// [(count - (count % 3)) / 3] 的值为 0 0 0 1 1 1 ···
// [count % 3] ->在0-2之间循环
spareArray[(count - (count % 3)) / 3][count % 3] = Integer.parseInt(s);
count ++;
}
return spareArray;