文章目录
java数据结构(1) 稀疏数组sparsearray
此博客为学习笔记,学习尚硅谷java数据结构课程后所撰写的笔记。
1. 需求案例
1.1 保存棋盘信息至文件
假如把白棋设为1,黑棋设为2,空棋设为0,将棋盘看作一个二维数组。
当棋子数较少时,0很多,使用二维数组保存数据到文件中,会保留大量无用的0 (这是没什么意义的数据)
2. 稀疏数组简介
2.1 使用方法
记录数组行列数以及多少个不同的值
将行,列,值三个元素记录在一个小规模数组中
2.2 使用场景
当一个数组中大部分元素为同一个值时,使用稀疏数组保存该数组。
3.稀疏数组代码实例
3.1实例
…去了趟4399,玩了把五子棋。
使用稀疏数组保存如图所示棋盘信息 棋盘14*14 假如把白棋设为1,黑棋设为2,空棋设为0
3.2 代码实现
跟多细节性的东西,都写在了注释里面:
这是完整源码,可直接编译运行
package sparsearray;
/**
* 稀疏数组
* 保存棋盘信息
* 棋盘15*15 白棋设为1,黑棋设为2,空棋设为0
*/
public class sparsearraytest {
//private static int chessboardInfor[][]=new int[15][15];
public static void main(String[] args) {
int chessboardInfor[][] = new int[15][15];
//白棋为1
chessboardInfor[6][4] = 1;
chessboardInfor[7][9] = 1;
chessboardInfor[8][7] = 1;
chessboardInfor[8][9] = 1;
//黑棋为2
chessboardInfor[5][6] = 2;
chessboardInfor[6][7] = 2;
chessboardInfor[7][7] = 2;
chessboardInfor[7][8] = 2;
chessboardInfor[8][8] = 2;
//空棋为0(int 数组默认为0)
//输出普通数组的存储结果
System.out.println("普通数组存储结果");
for (int[] row : chessboardInfor) {
for (int data : row) {
System.out.print(" " + data);
}
//换行
System.out.println();
}
//不用稀疏数组的话就直接将该数组存储到文件了,此步骤省略
//问题是存放了大量的无用数据0,浪费了存储空间
/**
* 将上边二维数组 转换为 稀疏数组
* 1.遍历数组记录非0个数
* 2.创建对应的稀疏数组
* 3.将原数组非0元素赋值给稀疏数组
* 4.打印稀疏数组中的值
*/
//1 遍历数组 记录非0个数
int number = 0;
for (int i = 0; i < 14; i++) {
for (int j = 0; j < 14; j++) {
if (chessboardInfor[i][j] != 0)
number++;//记录非0个数
}
}
System.out.println("非0个数" + number);
//2 创建对应的稀疏数组
int sparsearray[][] = new int[number + 1][3];
//在数组首部存储 行 列 非0个数,这三个参数
sparsearray[0][0] = 15;
sparsearray[0][1] = 15;
sparsearray[0][2] = number;
//3.将原数组非0元素赋值给稀疏数组
int count = 0;//记录到达了第几个非0数
for (int i = 0; i < 15; i++) {
for (int j = 0; j < 15; j++) {
if (chessboardInfor[i][j] != 0) {
count++;//到达了第 count++ 个非0数
//将 行,列,非零数值 存放近稀疏数组
sparsearray[count][0] = i;
sparsearray[count][1] = j;
sparsearray[count][2] = chessboardInfor[i][j];
}
}
}
//4.打印稀疏数组中的值
System.out.println("稀疏数组的存储结果");
for (int i = 0; i < sparsearray.length; i++) {
System.out.println(sparsearray[i][0] + " "
+ sparsearray[i][1] + " "
+ sparsearray[i][2]);
}
/**
* 已知稀疏数组 转换为 普通二维数组
* 1.读取第一行,获取行数和列数,并创建二维数组
* sparsearray[0][0]:总行数
* sparsearray[0][1]:总列数
* sparsearray[0][2]:非0数的个数
* 假设 在稀疏数组中下标为k(k>0),原始二维数组中元素(i,j)值为2,则sparsearray[k][0]=i sparsearray[k][1]=j sparsearray[k][2]=2
*
* 2.读取后面的值 并按照行列数 赋值给二维数组即可
*/
//1.读取第一行,获取行数和列数,并创建二维数组
int chessboardInfor2[][] =new int [sparsearray[0][0]][sparsearray[0][1]];
//2.读取后面的值 并按照行列数 赋值给二维数组即可
//i从1开始遍历,因为下标0位置是存储总行数,总列数,和非0元素个数的地方
for (int i=1;i<sparsearray.length;i++){
chessboardInfor2[sparsearray[i][0]][sparsearray[i][1]]=sparsearray[i][2];
}
//输出稀疏数组 转换为 普通二维数组的存储结果
System.out.println("稀疏数组 转换为 普通二维数组的存储结果");
for (int[] row : chessboardInfor2) {
for (int data : row) {
System.out.print(" " + data);
}
//换行
System.out.println();
}
}
}
3.3 运行结果
运行结果: