案例分析
1)使用稀疏数组,来保留类似前面的二维数组(棋盘、地图等)
2)把稀疏数组存盘,并且可以从新恢复原来的二维数组数
3)思路分析
代码实现:
package com.alibaba.sparsearray;
import java.io.*;
public class SparseArray {
public static void main(String[] args) throws IOException {
//创建原始的二维数组 11*11
//0:表示没有棋子,1:表示黑子,2:表示白子
int[][] chessArr1=new int[5][5];
chessArr1[1][1]=1;
chessArr1[2][2]=2;
//输出原始的二维数组
System.out.println("原始的二维数组:");
for (int[] row :chessArr1) {
for (int data:row){
System.out.printf("%d\t",data);
}
System.out.println();
}
//将二维数组转为稀疏数组
//1.先遍历原始的二维数组,得到有效数据的个数sum
int sum=0;
for (int i = 0; i < chessArr1.length; i++) {
for (int j = 0; j < chessArr1.length; j++) {
if (chessArr1[i][j]!=0){
sum++;
}
}
}
System.out.println(sum);
//创建对应的稀疏数组
int[][] sparseArr=new int[sum+1][3];
//给稀疏数组赋值
sparseArr[0][0]=5;
sparseArr[0][1]=5;
sparseArr[0][2]=sum;
//遍历二维数组,将非0的值存到sparseArr中
int counnt=0;
for (int i = 0; i < chessArr1.length; i++) {
for (int j = 0; j < chessArr1.length; j++) {
if (chessArr1[i][j]!=0){
counnt++;
sparseArr[counnt][0]=i;//row
sparseArr[counnt][1]=j;//col
sparseArr[counnt][2]=chessArr1[i][j];//val
}
}
}
//输出稀疏数组的形式
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]);
}
//使用io将稀疏数组存入文件
File file = new File("h:/map.data");
FileWriter fw = new FileWriter(file);
for (int[] rows : sparseArr) {
for (int data : rows) {
fw.write(data + "\t");
}
fw.write("\r\n");
}
fw.close();
System.out.println("写入文件成功!!!");
//从文件中进行恢复
BufferedReader br = new BufferedReader(new FileReader(file));
String line;
int row1 = 0;
//创建一个新的稀疏数组接受读取出来的数据
int[][] sparseArr2 = new int[3][3];//加入已经知道大小
while ((line = br.readLine()) != null) {
String[] temp = line.split("\t");
for (int i = 0; i < temp.length; i++) {
sparseArr2[row1][i] = Integer.parseInt(temp[i]);
}
row1++;
}
br.close();
System.out.println();
//将稀疏数组转为原始的二维数组
//先读取稀疏数组的第一行,根据第一行的数据创建原始的二维数组
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];
}
//输出原始的二维数组
for (int[] row :chessArr2) {
for (int data:row){
System.out.printf("%d\t",data);
}
System.out.println();
}
}
}