先看一个实际的需求
编写的五子棋程序中,有存盘退出和续上盘的功能。
分析问题:
因为该二维数组的很多值是默认值0, 因此记录了很多没有意义的数据.->稀疏数组。
应用实例
- 使用稀疏数组,来保留类似前面的二维数组(棋盘、地图等等) 把稀疏数组存盘,
- 并且可以从新恢复原来的二维数组数
- 整体思路分析
- 代码实现
package com.lhc.sparsearray;
public class SparseArray {
public static void main(String[] args) {
//创建一个原始的二维数组11*11
//0:表示没有棋子,1:表示黑子,2表示蓝子
int chessArr1[][]=new int[11][11];
chessArr1[1][2]=1;
chessArr1[2][3]=2;
//输出原始数组
System.out.println("原始的二维数组~~~~~~~~~~~");
for(int[] row:chessArr1) {
for(int data:row) {
System.out.printf("%d\t",data);
}
System.out.println();
}
//将二维数组转化成稀疏数组
//1.先遍历二维数组,得到非零数据的个数
int sum=0;
for (int i = 0; i < 11; i++) {
for(int j=0;j<11;j++) {
if(chessArr1[i][j]!=0) {
sum++;
}
}
}
//2.创建对应的稀疏数组
int sparseArr[][]=new int [sum+1][3];
//给稀疏数组赋值
sparseArr[0][0]=11;
sparseArr[0][1]=11;
sparseArr[0][2]=sum;
//遍历二维数组,讲非零的值存放到稀疏数组中
int count=0;//count用来记录第几个非零数据
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("得到的稀疏数组为~~~~~~~~~~~~");
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();
//将稀疏数组----->二维数组
//1.先读取稀疏数组第一行,创建原始二维数组
int chessArr2[][]=new int [sparseArr[0][0]][sparseArr[0][1]];
System.out.println();
/*
System.out.println("恢复后的二维数组~~~~~~~~~~~~~~");
for(int[] row:chessArr2) {
for(int data:row) {
System.out.printf("%d\t",data);
}
System.out.println();
}
*/
//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();
}
}
}