使用二维数组保存一个棋盘,将其转换成稀疏数组的形式进行保存,再读取稀疏数组,将其还原成原本的棋盘。
package com.guigu.sparseArray;
import java.io.*;
/**
* @author: guorui fu
* @versiion: 1.0
*/
public class sparseArray {
public static void main(String[] args) throws IOException {
//创建一个原始的二位数组11*11 0为没有棋子 1为黑子,2为蓝子
int chessArr1[][] = new int[11][11];
chessArr1[1][2] = 1;
chessArr1[2][3] = 2;
System.out.println("原始的二维数组");
for (int[] row : chessArr1){
for (int data :row){
System.out.printf("\t" + data);
}
System.out.println();
}
//稀疏数组
//1.统计不为0数字个数
int sum =0;
for (int i = 0 ;i < 11 ;i++){
for (int j = 0;j < 11;j++){
if (chessArr1[i][j] != 0){
sum++;
}
}
}
System.out.println("sum= " + sum);
//2.创建稀疏数组
int sparseArr[][] = new int[sum + 1][3];
//给稀疏数组赋值
sparseArr[0][0] = 11;
sparseArr[0][1] = 11;
sparseArr[0][2] = 2;
//非零值存入稀疏数组
int count = 0; //记录是第几个非0数据
for (int i = 0 ;i < 11 ;i++){
for (int j = 0;j < 11;j++){
if (chessArr1[i][j] != 0){
count++;
sparseArr[count][0] = i;
sparseArr[count][1] = j;
sparseArr[count][2] = chessArr1[i][j];
}
}
}
//sparseArr稀疏数组输出文件
System.out.println("开始输出文件");
String filePath = "D:\\fgr-dataStructures\\code\\sparseArr.data";
File file = new File(filePath);
if (!file.isFile()){
file.createNewFile();
}
BufferedWriter bufferedWriter = null;
try {
bufferedWriter = new BufferedWriter(new FileWriter(file));
for (int i = 0; i < sparseArr.length; i++) {
for (int j = 0; j < sparseArr[i].length; j++) {
bufferedWriter.write(" " + sparseArr[i][j]);
}
}
bufferedWriter.newLine();
} catch (Exception e) {
e.printStackTrace();
}finally {
if (bufferedWriter != null){
bufferedWriter.close();
}
}
System.out.println("输出文件完毕");
//输出稀疏数组
System.out.println("稀疏数组=========");
for (int i = 0 ; i < sparseArr.length; i++){
System.out.print("\t\n" + sparseArr[i][0] + "\t" + sparseArr[i][1] + "\t" + sparseArr[i][2]);
}
System.out.println();
//将稀疏数组恢复成二维数组
//1.先读取稀疏数组
System.out.println("读取文件");
int sparserArr1[][] = new int[sparseArr.length][sparseArr[0].length];
BufferedReader bufferedReader = new BufferedReader(new FileReader(file));
String readLine = null;
while (bufferedReader.read() != -1){
readLine = bufferedReader.readLine();
}
//关闭bufferedReader
bufferedReader.close();
System.out.println("读取文件完毕");
String[] readlineStr = readLine.split(" ");
System.out.println("readlineStr" + readlineStr.toString());
int a = 0;
for (int i = 0; i < sparserArr1.length; i++) {
for (int j = 0; j < sparserArr1[i].length; j++) {
sparserArr1[i][j] = Integer.parseInt(readlineStr[a++]);
System.out.print(sparserArr1[i][j]);
}
System.out.println();
}
//稀疏数组赋值给棋盘数组
int chessArr2[][] = new int[sparseArr[0][0]][sparseArr[0][1]];
//遍历稀疏数组 从第二行开始
for (int i = 1 ; i < sparserArr1.length; i++){
chessArr2[sparserArr1[i][0]][sparserArr1[i][2]] = sparserArr1[i][2];
}
System.out.println();
//恢复后的二维数组
System.out.println("=================恢复后的棋盘数组");
for (int[] row : chessArr2){
for (int data :row){
System.out.printf("\t" + data);
}
System.out.println();
}
}
}