package sparsearray;
import java.io.*;
public class SparseArray {
public static void main(String[] args) {
//建立一個原始的二維數組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("%d\t",data);
}
System.out.println();
}
//統計原始二維數組不為0的的個數
int count = 0;
for (int[] row : chessArr1) {
for (int data : row) {
if(data != 0) {
count++;
}
}
}
System.out.println("原始二維數組不為0的的個數為:"+count);
//定義稀疏數組
int[][] sparseArr = new int[count+1][3];
//稀疏數組第一行的值
sparseArr[0][0] = chessArr1.length;
sparseArr[0][1] = chessArr1[0].length;
sparseArr[0][2] = count;
//為稀疏數組其他行指派
int count2 = 0;//記錄是第幾個非零的資料
for (int i = 1;i<chessArr1.length;i++) {
for (int j = 0;j<chessArr1[0].length;j++) {
if (chessArr1[i][j]!=0) {
count2++;
sparseArr[count2][0] = i;
sparseArr[count2][1] = j;
sparseArr[count2][2] = chessArr1[i][j];
}
}
}
System.out.println("");
System.out.println("稀疏數組為:");
//周遊稀疏數組
for (int i =0;i<sparseArr.length;i++) {
System.out.printf("%d\t%d\t%d\t\n",sparseArr[i][0],sparseArr[i][1],sparseArr[i][2]);
}
System.out.println("開始寫入檔案<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<");
//将稀疏數組儲存到磁盤E:\java\repos\idea_repos\DataStructures\src\sparsearray\data.txt,檔案名為data.txt
BufferedWriter out =null;
try {
out = new BufferedWriter(new FileWriter("E:\\java\\repos\\idea_repos\\DataStructures\\src\\sparsearray\\map.data",true)); //檔案寫入流
//将數組中的元素寫入檔案,每個用tab隔開
for(int i = 0;i<sparseArr.length;i++) {
for (int j=0;j<sparseArr[0].length;j++) {
out.write(sparseArr[i][j]+"\t");
}
out.newLine();
// out.write("\r\n");
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (out!=null) {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
System.out.println("寫入檔案成功<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<");
/**
* 讀取map.data檔案
*/
BufferedReader br = null;
int readRow = 0;//記錄行數
// String[] temp =null;//讀取的數組
//建新的稀疏數組
int[][] sparseArr2 = new int[count+1][3];
try {
br = new BufferedReader(new FileReader("E:\\java\\repos\\idea_repos\\DataStructures\\src\\sparsearray\\map.data"));
String line = null;
//統計行數
while ((line = br.readLine()) !=null) {
String[] temp = line.split("\t");
for (int j = 0;j<temp.length;j++) {
sparseArr2[readRow][j] = Integer.parseInt(temp[j]);
}
readRow++;
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (br!=null) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 周遊讀取的稀疏數組
*/
System.out.println("從磁盤讀取的稀疏數組為:");
for (int i = 0;i<sparseArr2.length;i++) {
System.out.printf("%d\t%d\t%d\t\n",sparseArr2[i][0],sparseArr2[i][1],sparseArr2[i][2]);
}
/**
* 将稀疏數組轉為二維數組
*/
//根據稀疏數組建立二維數組
int[][] chessArr2 = new int[sparseArr2[0][0]][sparseArr2[0][1]];
//為二維數組指派
for(int i = 1; i < sparseArr2.length; i++) {
chessArr2[sparseArr2[i][0]][sparseArr2[i][1]] = sparseArr2[i][2];
}
System.out.println();
System.out.println("轉換後的新的二維數組為:");
//輸出新的二維數組
for (int[] row : chessArr2) {
for (int data : row) {
System.out.printf("%d\t",data);
}
System.out.println();
}
}
}