稀疏数组
当一个数组大部分都为元素0,或为同一个值的数组时,可以使用稀疏数组
即将一个原始数组进行压缩保存
举例:五子棋下棋中途保存
保存方法
1.记录原始数组一共有几行几列,有多少个不同的值
2.把具有不同值的元素的行列及值的数据记录在一个小规模数组中,从而缩小程序的规模
应用场景举例
创建一个11*11的棋盘,其中1代表黑子,2代表蓝子,其余地方都可以填充0代替,因此可以创建出一个二维数组
用稀疏数组将原始数组压缩,其中
第一行第一列:记录原始数组行数
第一行第二列:记录 原始数组列数
第一行第三列:记录不同值的个数
第二行开始,第一列记录特殊值的行坐标,第二列记录特殊值的列坐标,第三列记录值本身数据.
以此类推,将所有非0的值的坐标及值的数据,记录到每一行,可以形成一个新的数组(稀疏数组)
int sparseArr[][] = new int[11][11]{{11,11,3},
{1,2,1},
{2,3,2},
{4,5,2}};
代码实现
创建一个原始的二维数组11*11
0:代表没有棋子 1:代表黑子 2:代表蓝子
int chessArr1[][] = new int[11][11];
chessArr1[1][2] = 1;
chessArr1[2][3] = 2;
chessArr1[4][5] = 2;
开始将原始数组转换为稀疏数组
思路实现:
1.先遍历二维数组 得到非0数据的个数
int sum = 0; //记录非零个数
for(int i = 0 ; i < chessArr1.length ; i++) {
for(int j = 0 ; j < chessArr1[i].length ; j++) {
if(chessArr1[i][j] != 0) {
sum++;
}
}
}
2.创建对应的稀疏数组
行数 = 非0数据个数+1
列数 = 3
int sparseArr[][] = new int[sum+1][3];
sparseArr[0][0] = chessArr1.length; //第一行第一列,存多少行
sparseArr[0][1] = chessArr1[0].length;//存多少列
sparseArr[0][2] = sum;//非0数据个数
3.遍历二维数组,将非0的值存放到稀疏数组中
int count = 0;//用于记录是第几个非0数据
//开始循环原始数组
for(int i = 0 ; i < chessArr1.length ; i++) {
for(int j = 0 ; j < chessArr1[i].length ; j++)
{
if(chessArr1[i][j] != 0) {
count++; //当值非0时,非0数据个数+1
sparseArr[count][0] = i; //第一列存放行
sparseArr[count][1] = j; //第二列存放列
sparseArr[count][2] = chessArr1[i][j];
}
}
}
4.输出形成的稀疏数组
for(int i = 0 ; i < sparseArr.length ; i++) {
for(int j = 0 ; j < sparseArr[i].length ; j++) {
System.out.printf("%d\t",sparseArr[i][j]);
}
System.out.println();
}
5.将稀疏数组恢复成原始的二维数组
int chessArr2[][] = new int[sparseArr[0][0]][sparseArr[0][1]];
for(int i = 1 ; i < sparseArr.length ; i++) {
chessArr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
}
6.恢复后的二维数组与原始数组一致
System.out.println("恢复后的二维数组");
for(int[] row : chessArr2) {
for(int item : row) {
System.out.printf("%d\t",item);
}
System.out.println();
}
附加尝试
1.如果普遍数据不是0,稀疏数组如何恢复二维数组
int index = 1;//确定有效数据行位置,起始为1
for(int i = 0 ; i < chessArr2.length ; i++) {
for(int j = 0 ; j < chessArr2[i].length ; j++) {
//index的范围为1-有效数据个数: 1-sparseArr[0][2]
if(i == sparseArr[index][0] && j == sparseArr[index][1]) {
chessArr2[i][j] = sparseArr[index][2];
if(index < sparseArr[0][2]) {
index++;
}
}
else {
//假设普遍值为5
chessArr2[i][j] = 5;
}
}
}
2.将完成的稀疏数组数组保存至文件里
//文件路径定义在主方法外面:Public static String filePath
File file = new File(filePath);
//判断文件是否存在
if(!file.exists()) {
try {
file.createNewFile();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Writer out = new FileWriter(file);
//将每一行数据转为String类型,写入文件
String temp = "";
StringBuffer st = new StringBuffer(temp);
for(int i = 0 ; i < sparseArr.length ; i++) {
for(int j = 0 ; j < sparseArr[i].length ; j++) {
st.append(sparseArr[i][j]);
st.append("、");
}
String temp2 = st.toString();
try {
out.write(temp2);
out.write("\r\n");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
st.delete(0, st.length()); //每写完一行清空StringBuffer
}
out.close(); //关闭Writer