二维数组–>稀疏数组–>磁盘–>稀疏数组–>二维数组
package com.shilei.dataStructure.array;
import java.io.*;
/**
* @author shilei
* @date 2020/4/7-21:17
*/
public class SparseArray {
public static final String filePath = "d:\\sparseArray.data";
public static void main(String[] args) {
int[][] array = new int[11][11];
array[2][2] = 2;
array[3][3] = 3;
printArray(array);
System.out.println("----------转为稀疏数组");
int[][] sparseArray = arrayToSparseArray(array,2);
printArray(sparseArray);
System.out.println("---将稀疏数组记录到文件中");
sparseArrayToFile(sparseArray);
System.out.println("-----从文件中读出稀疏数组");
int[][] fileSparseArray = fileToSparseArray();
printArray(fileSparseArray);
System.out.println("将稀疏数组转化为普通数组");
int[][] fileArray = sparseArrayToArray(fileSparseArray);
printArray(fileArray);
}
//打印二维数组
public static void printArray(int[][] array){
for (int i = 0;i<array.length;i++){
for (int j=0;j<array[i].length;j++){
System.out.print(array[i][j]+"\t");
}
System.out.println();
}
}
//二维数组转为稀疏数组
public static int[][] arrayToSparseArray(int[][] array,int sum){
int[][] sparseArray = new int[sum+1][3];
//稀疏数组总共三列
// 第一行第一列 记录原二维数组的行数
sparseArray[0][0]= array.length;
// 第一行第二列 记录原二维数组的列数
sparseArray[0][1]=array[0].length;
// 第一行第三列 记录原二维数组中有几个非零数
sparseArray[0][2]=sum;
int index = 1;//记录稀疏数组的列数
for (int i = 0 ;i<array.length;i++){
for (int j=0;j<array[0].length;j++){
if (array[i][j] != 0){
sparseArray[index][0]=i;//记录行索引
sparseArray[index][1]=j;//记录列索引
sparseArray[index][2]=array[i][j];//记录值
index++;
}
}
}
return sparseArray;
}
//将稀疏数组写入磁盘中
public static void sparseArrayToFile(int[][] sparseArray){
File file = new File(filePath);
StringBuilder sb = new StringBuilder();
for (int i = 0 ;i<sparseArray.length;i++){
for (int j=0;j<sparseArray[0].length;j++){
sb.append(sparseArray[i][j]).append("\t");
}
sb.append("\n");
}
try (FileWriter fileWriter = new FileWriter(file)){
fileWriter.write(sb.toString());
fileWriter.flush();
}catch (Exception e){
e.printStackTrace();
}
}
//将磁盘中的数据读到内存中并转化为稀疏数组
public static int[][] fileToSparseArray(){
File file = new File(filePath);
try (BufferedReader reader = new BufferedReader(new FileReader(file))){
//读出第一行数据 根据第一行数据中的值创建稀疏数组
String line = reader.readLine();
String[] split = line.split("\t");
int[][] fileSparseArray = new int[Integer.valueOf(split[2])+1][3];
fileSparseArray[0][0] = Integer.valueOf(split[0]);
fileSparseArray[0][1] = Integer.valueOf(split[1]);
fileSparseArray[0][2] = Integer.valueOf(split[2]);
int index = 1;
while ((line = reader.readLine()) != null){
split = line.split("\t");
fileSparseArray[index][0] = Integer.valueOf(split[0]);
fileSparseArray[index][1] = Integer.valueOf(split[1]);
fileSparseArray[index][2] = Integer.valueOf(split[2]);
index++;
}
return fileSparseArray;
}catch (Exception e){
e.printStackTrace();
}
return null;
}
//将稀疏数组转化为二维数组
public static int[][] sparseArrayToArray(int[][] sparseArray){
int[][] array = new int[sparseArray[0][0]][sparseArray[0][1]];
for (int i =1;i<sparseArray[0][2]+1;i++){
array[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2];
}
return array;
}
}