将稀疏数组保存到磁盘上,文件名map.data 读取map.data恢复稀疏数组
PS: 这是韩顺平老师(Java数据结构与java算法)布置的一道小作业
package sparsearray;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
public class SparseArray {
public static void main(String[] args) {
/*
* chessArray1 表示原始数组:11*11
* 0:表示没有棋子; 1:表示有黑色棋子; 2表示有蓝色棋子
* */
int[][] chessArray1 = new int[11][11];
chessArray1[1][2] = 1;
chessArray1[2][3] = 2;
chessArray1[4][5] = 2;
int sum = 0;
//输出原始数组
System.out.println("原始矩阵");
sum = toChessArray(chessArray1);
//将二维数组转换为稀疏矩阵
int[][] spareArray = new int[sum+1][3];
spareArray[0][0] = chessArray1.length;
spareArray[0][1] = chessArray1[0].length;
spareArray[0][2] = sum;
int count = 0;
for (int i = 0; i < chessArray1.length; i++)
for (int j = 0; j < chessArray1[0].length; j++)
if(chessArray1[i][j] != 0){
count ++;
spareArray[count][0] = i;
spareArray[count][1] = j;
spareArray[count][2] = chessArray1[i][j];
}
dumpToDestop(spareArray); //将稀疏数组保存在磁盘中
spareArray = readFromDisk2();
//输出稀疏矩阵
System.out.println("稀疏矩阵:");
for (int[] row : spareArray) {
for (int data : row) {
System.out.printf("%d\t",data);
}
System.out.println();
}
//稀疏矩阵转换为二维矩阵
int[][] chessArray2 = new int[spareArray[0][0]][spareArray[0][1]];
for (int i = 1; i < spareArray.length; i++) {
chessArray2[spareArray[i][0]][spareArray[i][1]] = spareArray[i][2];
}
//输出 稀疏矩阵转换为二维矩阵 的值
System.out.println("原始矩阵");
toChessArray(chessArray2);
}
public static int toChessArray(int[][] chessArray){
int sum = 0;
for (int[] row : chessArray) {
for (int data : row) {
System.out.printf("%d ",data);
if(data != 0){
sum ++;
}
}
System.out.println();
}
return sum;
}
public static void dumpToDestop(int[][] sparseArray){
try {
File file = new File("map.data");
FileOutputStream fileOutputStream = new FileOutputStream(file);
OutputStreamWriter writer = new OutputStreamWriter(fileOutputStream,"UTF-8");
for (int i = 0; i < sparseArray.length; i++) {
writer.append(sparseArray[i][0]+"\t"+sparseArray[i][1]+"\t"+sparseArray[i][2]+"\n");
}
writer.close();
fileOutputStream.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
//方法一:
public static int[][] readFromDisk(){
List<String> lists =new ArrayList<>();
int[][] spareArray;
try {
File file = new File("map.data");
InputStreamReader reader = new InputStreamReader(new FileInputStream(file),"UTF-8");
BufferedReader bufferedReader = new BufferedReader(reader);
String line = null;
int count =0; //当前数组所在的列数
while((line = bufferedReader.readLine()) != null){
lists.add(line);
}
String[] contents = new String(lists.get(0)).split("\t");
spareArray =new int[Integer.parseInt(contents[2])+1][Integer.parseInt(contents[2])];
spareArray[0][0] = Integer.parseInt(contents[0]);
spareArray[0][1] = Integer.parseInt(contents[1]);
spareArray[0][2] = Integer.parseInt(contents[2]);
for (int i = 1; i < lists.size(); i++) {
contents = new String(lists.get(i)).split("\t");
spareArray[i][0] = Integer.parseInt(contents[0]);
spareArray[i][1] = Integer.parseInt(contents[1]);
spareArray[i][2] = Integer.parseInt(contents[2]);
}
return spareArray;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
//方法二
public static int[][] readFromDisk2(){
try {
File file =new File("map.data");
FileInputStream fis = new FileInputStream(file);
InputStreamReader reader = new InputStreamReader(fis, "UTF-8");
StringBuffer sb = new StringBuffer();
while (reader.ready()) {
sb.append((char) reader.read());// 转成char加到StringBuffer对象中
}
System.out.println(sb.toString());
String[] str =sb.toString().split("\\s+");
int count = 0;
int[][] spareArray = new int[str.length/3 ][3];
for (String s : str) {
spareArray[(count - (count % 3)) / 3][count % 3] = Integer.parseInt(s);
//参考:https://blog.youkuaiyun.com/qq_43270712/article/details/103391008
count ++;
}
return spareArray;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
}