稀疏数组
使用环境
*当需要保存二维数组时,二维数组内含有大量无意义数据(如大多为0或相同的值)时,
可先将其转化为稀疏数组,然后再存入文件
相当于进行压缩操作
*如应用于五子棋的局面保存
处理方法
*数组内第一行记录一共有几行几列,有多少个不同的值
*然后将不同数对应的行列及值记录在之后
*以上操作形成一个新的小规模数组,从而达到压缩作用
具体操作
*遍历原数组,得出有效数据个数sum
*根据sum创建稀疏数组(sparseArr) int[sum+1][3]
*将原数组的有效数据存入稀疏数组中
恢复原数组的操作:
*先读取稀疏数组第一行,根据数据创建原始二维数组
*再读取后几行数据,赋值到对应位置
代码实现(五子棋盘)
package 稀疏数组的运用;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class sparseArr {
public static void main(String[] args) throws Exception{
//创建一个初始数组10*10表示棋盘
//0表示没有棋子,1表示黑棋,2表示白棋
int chessArr1[][] = new int[10][10];
chessArr1[2][5] = 1;
chessArr1[5][7] = 2;
//输出初始数组
for(int []row : chessArr1){
for(int data:row){
System.out.printf("%d\t",data);
}
System.out.println();//每输出一行换行
}
//转换为稀疏数组
//先遍历得出有效数字个数
int sum = 0;
for(int i = 0;i < 10; i++){
for(int j = 0;j < 10; j++){
if(chessArr1[i][j] != 0)
sum++;
}
}
//创建稀疏数组
int sparseArr[][] = new int [sum+1][3];
//赋值
sparseArr[0][0] = 10;
sparseArr[0][1] = 10;
sparseArr[0][2] = sum;
//遍历二维数组,将有效数字放入稀疏数组
int count = 0; //用于记录第几个有效数字;
for(int i = 0;i < 10; i++){
for(int j = 0;j < 10; j++){
if(chessArr1[i][j] != 0){
count++;
sparseArr[count][0] = i;
sparseArr[count][1] = j;
sparseArr[count][2] = chessArr1[i][j];
}
}
}
//输出稀疏数组
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();
//保存录入文件并读取
ObjectOutputStream output = new ObjectOutputStream(new FileOutputStream("map.data"));
output.writeObject(sparseArr);
output.close();
ObjectInputStream input = new ObjectInputStream(new FileInputStream("map.data"));
int[][] sparseArr2 = (int[][]) input.readObject();
//恢复稀疏数组(文件io部分)
//先读取稀疏数组,并创建新二维数组
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();//每输出一行换行
}
input.close();
}
}