实际问题描述:
通常在围棋,五子棋方面会将棋盘的当前状态保存起来,由于在下棋的过程中可能会有大量的棋盘未放置棋子的状态0状态,白棋为1状态,黑棋子为2状态。
例如下图:
其中大量的0元素并没有保存的价值,因此,在保存该数组时需使用另一个数组进行保存,称之为稀疏数组。稀疏数组的建立:在稀疏数组的第一行记录原数组的行数、列数、不同数值的个数;在其他行记录不为0的元素所在的行数、列数以及数值。
上图的稀疏矩阵是一个三行三列的矩阵,图如下所示:
这样存储的数据量就小了很多(1111压缩为33)
1.原数组转换成稀疏数组代码实现:
//创建一个原始的二维数组,用0表示没有棋子
int chessarr[][]=new int[11][11];
chessarr[1][2]=1;
chessarr[2][3]=2;
System.out.println("原始二维数组===");
//使用增强for打印二位数组
/*for(int[] row:chessarr){
for(int i:row){
System.out.printf("%d\t",i);
}
System.out.println();
}
*/
//将二维数组转换成稀疏数组,便利原数组计算不一样数字的个数
int sum=0;
for(int i=0;i<chessarr.length;i++){
for(int j=0;j<chessarr[0].length;j++){
if(chessarr[i][j]!=0)
sum++;
}
}
System.out.println(sum);
//创建稀疏数组,先放入原数组的大小以及不一样元素的个数
int separearr[][]=new int[sum+1][3];
separearr[0][0]=chessarr.length;
separearr[0][1]=chessarr[0].length;
separearr[0][2]=sum;
int tmp=1;
for(int i=0;i<chessarr.length;i++){
for(int j=0;j<chessarr[0].length;j++){
if(chessarr[i][j]!=0){
separearr[tmp][0]=i;
separearr[tmp][1]=j;
separearr[tmp][2]=chessarr[i][j];
tmp++;
}
}
}
System.out.println("稀疏数组为========================");
for(int[] row:separearr){
for(int i:row){
System.out.printf("%d\t",i);
}
System.out.println();
}
- 将原数组转换成稀疏数组时需要进行存盘处置(I/O数据写入):
//将生成的二位矩阵写入磁盘文件中
File file=new File("F:/javawork/javvatest.txt");//存放的文件以及
FileWriter fwriter=new FileWriter(file);//问件写入流
for(int k=0;k<separearr.length;k++){
for(int j=0;j<separearr[0].length;j++){
fwriter.write(separearr[k][j]+"\t");
}
fwriter.write("\r\n");
}
fwriter.close();
3.将数组从磁盘读取(I/O数据读取)
//将磁盘数据读取到新的矩阵中
FileReader read=new FileReader(file);
BufferedReader bf=new BufferedReader(read);
String line;
int arr2[][]=new int[sum+1][3];
int row2=0;
while((line=bf.readLine())!=null)
{
String[] tmp2=line.split("\t");
for(int i=0;i<tmp2.length;i++){
arr2[row2][i]=Integer.parseInt(tmp2[i]);
}
row2++;
}
4.将稀疏数组还原(相当于棋盘还原)
//将稀疏数组进行还原,先根据稀疏数组创建棋盘
int chessarr2[][]=new int[separearr[0][0]][separearr[0][1]];
//恢复数据
for(int i=1;i<=sum;i++){
chessarr2[separearr[i][0]][separearr[i][1]]=separearr[i][2];
}
System.out.println("恢复的原始数组为---------------");
for(int[] row:chessarr2){
for(int i:row){
System.out.printf("%d\t",i);
}
System.out.println();
}
参考韩顺平java数据结构和算法。