疏数组:
五子棋之数据保存,在五子棋中我们保证中途退出时有一个保存记录这种操作,如果将整个棋盘保存下来,无用数据会很多,所以我们这里用稀疏数组对他进行一个压缩;
- 数据1为白棋
- 数据2为黑棋
- 数据0为无棋子
详细操作有
将二维数组转换为稀疏数组
案例黑白棋:
package org.atguigu.sparsearray;
import java.io.*;
public class sparseArray {
public static void main(String[] args) throws IOException {
//制作一个期盼11*11 模拟成现实的期盼,根据row low
int chessArr1 [][] = new int [11][11];
chessArr1[1][2]= 1;
chessArr1[2][3]= 2;
chessArr1[3][8]= 1;
chessArr1[4][9]= 2;
chessArr1[6][3]= 1;
for(int [] row:chessArr1){
for (int data:row){
System.out.printf("%d\t",data);
}
System.out.println();
}
//将二维数组转换为稀疏数组
//1.先遍历二维数组,得到非零的数据的个数
int sum = 0;
for(int [] row:chessArr1){
for (int data:row){
if (data !=0) sum++;
}
System.out.println();
}
System.out.println(sum);
//2.创稀疏数组
int sparseArr[][] = new int [sum+1][3];
//给稀疏数组赋值
sparseArr[0][0]=11;
sparseArr[0][1]=11;
sparseArr[0][2]=sum;
//遍历二维数组,将非0的值存放到sparseArr中
int count =0; // count 用于记录是第几个非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];
}
}
}
//输出稀疏数组的形式
System.out.println();
System.out.println("得到的稀疏数组为~~~~");
System.out.println("row col val");
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();
// 恢复为二维数组
System.out.println("恢复后");
//1.先读取稀疏数组的第一行
int [][]chessArr2 = new int[sparseArr[0][0]][sparseArr[0][1]];
//2.在读取稀疏数组的后几行
for (int i = 1; i < sparseArr.length ; i++) {
chessArr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr [i][2];
}
//输出
for(int [] row:chessArr2){
for (int data:row){
System.out.printf("%d\t",data);
}
System.out.println();
}
//下面是对数据进行的硬盘存储和读写
File file = new File("d:\\insist\\play.txt");
OutputStream os = new FileOutputStream(file);
for (int i = 0; i < sparseArr.length; i++) {
for (int j = 0; j < sparseArr[i].length; j++) {
os.write(Integer.valueOf(sparseArr[i][j]));//getBytes,获取字节数组String类型
}
System.out.println();
}
InputStream is = new FileInputStream(file);
int a ;
while ((a=is.read())!=-1){
System.out.printf("%d\t",a);
}
os.close();
is.close();
}
}