稀疏数组
问题:如何保存一个下过的棋盘
方式一:直接用二维数组,来保存,没下棋的用0 来表示,黑子用1,白字用2
存在的问题:浪费大量的空间,很多没有意义的数据 0.
那么我们可以采用什么办法来解决呢?
方法二:稀疏数组
- 将棋盘的大小记录在数组的第一行,行列,以及存在多少下过的子
- 将每个下过棋子的行列放到稀疏数组保存起来,第三列记录他的值
- 将稀疏数组转化成正常的数组
下面是代码实现
public class SparseArr {
public static void main(String[] args) {
//创建原始棋盘 11×11
//0标识没有棋子,1表示黑子 2表示白子
int[][] chessArr = new int[11][11];
//放棋子
chessArr[1][2] = 1;
chessArr[2][4] = 2;
chessArr[5][6] = 1;
System.out.println("原始的数组为:~~~~~~~~~~~~~~~~~~");
for (int[] row : chessArr) {
for (int data : row) {
System.out.printf("%d\t", data);
}
System.out.println();
}
System.out.println("---------------------------------------------------------------");
//摆放了棋子个数
int count = 0;
//遍历数组,找放棋子的位置
for (int i = 0; i < chessArr.length; i++) {
for (int j = 0; j < chessArr[0].length; j++) {
//遍历到不是0 的数字,存储
if (chessArr[i][j] != 0) {
count++;
}
}
}
//创建稀疏数组,长度count+1行,3列
int[][] sparseArr = new int[count + 1][3];
//将原数组的行列数,放入到稀疏数组中
sparseArr[0][0] = chessArr.length;
sparseArr[0][1] = chessArr[0].length;
//已有的棋子放入第一行第三列
sparseArr[0][2] = count;
//遍历到不是0 的数字,存储
//将个数重置,再计算
count = 0;
for (int i = 0; i < chessArr.length; i++) {
for (int j = 0; j < chessArr[0].length; j++) {
if (chessArr[i][j] != 0) {
//将查到棋子的行列放入到稀疏数组中
sparseArr[count + 1][0] = i;
sparseArr[count + 1][1] = j;
sparseArr[count + 1][2] = chessArr[i][j];
count++;
}
}
}
System.out.println("得到稀疏数组为~~~~");
//打印出稀疏数组
for (int i = 0; i <sparseArr.length ; i++) {
for (int j = 0; j <sparseArr[0].length ; j++) {
System.out.printf("%d\t",sparseArr[i][j]);
}
System.out.println();
}
System.out.println();
//创建输出流,将数据保存在磁盘上
// FileWriter fw = null;
// try {
// fw = new FileWriter("sparseArr.data");
// StringBuffer stringBuffer = new StringBuffer();
// //一行一行,存储到文件中
// for (int i = 0; i < sparseArr.length; i++) {
// for (int j = 0; j < sparseArr[0].length; j++) {
// stringBuffer.append(sparseArr[i][j]).append("\t");
// fw.write(stringBuffer.toString());
// stringBuffer = new StringBuffer();
// }
// fw.write("\n");
// }
// } catch (FileNotFoundException e) {
// e.printStackTrace();
// } catch (IOException e) {
// e.printStackTrace();
// } finally {
// if (fw != null) {
// try {
// fw.close();
// } catch (IOException e) {
// e.printStackTrace();
// }
// }
// }
System.out.println("---------------------------------------------------");
//将稀疏数组 --》 恢复成 原始的二维数组
/*
* 1. 先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组,比如上面的 chessArr2 = int [11][11]
2. 在读取稀疏数组后几行的数据,并赋给 原始的二维数组 即可.
*/
//1. 先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组
//得到原来的数组长宽,创建数组
int[][] tochessArr = new int[sparseArr[0][0]][sparseArr[0][1]];
//一共有几个棋子
int chessNum = sparseArr[0][2];
//将下标从1开始,也就是放棋子位置的下标开始,放值
for (int i = 1; i <= chessNum; i++) {
tochessArr[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
}
System.out.println("输出稀疏数组转化后的原数组~~~~~~~~~~~~~~");
for (int i = 0; i < tochessArr.length; i++) {
for (int j = 0; j < tochessArr[0].length; j++) {
System.out.printf("%d\t", tochessArr[i][j]);
}
System.out.println();
}
}
}