稀疏数组案例练习
blog day1
需求分析
现有某行某列棋盘,棋盘上随机分布有部分棋子(棋子数目多,这样才有压缩价值)
现在需要存储棋子的位置,如果使用正常的二维数组,数组太大,而且在棋盘开始下棋时,会造成大量无效的数据,所以此处选择稀疏数组这种数据结构节省空间
上面棋盘的棋子位置假设以左上角为(0,0),白字设为1,黑子设为2,无子设为0
2 | |||||||||
1 | |||||||||
1 | |||||||||
由此可以定义一个棋盘数组
int checkerBoard[][] = new int[10][10];
checkerBoard[1][2] = 2;
checkerBoard[2][2] = 1;
checkerBoard[3][1] = 1;
打印棋盘需要用到二维数组的遍历
for(int i = 0; i < 10; i++){
for(int j = 0; j < 10; j++){
System.out.printf("%d\t", checkerBoard[i][j]);
}
System.out.println();
}
需要通过棋子的计数来获取稀疏数组的最大行数,稀疏数组的列数则为,一列为所有棋子行数,一列为所有棋子的列数,一列为棋子的特征值
// 进行棋子计数
int count = 0;
for(int i = 0; i < 10; i++){
for(int j = 0; j < 10; j++){
if(checkerBoard[i][j] != 0){
count++;
}
}
}
// 创建一个稀疏数组[conut + 1][3]
int[][] data = new int[count + 1][3];
data[0][0] = 10;
data[0][1] = 10;
data[0][2] = count;
重新遍历一次棋盘,把所有棋子的数据填入稀疏数组
// 遍历棋盘存储每个棋子的位置及参数到稀疏数组
int rowCount = 0;
for(int i = 0; i < 10; i++){
for(int j = 0; j < 10; j++){
if(checkerBoard[i][j] != 0){
rowCount++;
data[rowCount][0] = i;
data[rowCount][1] = j;
data[rowCount][2] = checkerBoard[i][j];
}
}
}
打印稀疏数组
// 打印此时的稀疏数组
for(int i = 0; i < count + 1; i++){
System.out.printf("%d\t%d\t%d\t\n", data[i][0], data[i][1], data[i][2]);
}
数据写入文件
从文件中读取数据
上面两步在IO里面,还没学
// TODO 后续增加IO操作
遍历稀疏数组提取数据放到新棋盘
int[][] checkerBoard2 = new int[data[0][0]][data[0][1]];
for(int i = 1; i < count + 1; i++){
checkerBoard2[data[i][0]][data[i][1]] = data[i][2];
}
// 打印新棋盘
for(int i = 0; i < data[0][0]; i++){
for(int j = 0; j < data[0][1]; j++){
System.out.printf("%d\t", checkerBoard2[i][j]);
}
System.out.println();
}
知识点
- 稀疏数组的数据结构
- 练习二维数组的遍历
- 格式化输出的写法