应用: 在某些实际问题中(比如五子棋)我们会创建一个二维数组来充当一个棋盘,而这张棋盘之中刚可能绝大部分数据均为0,而在将这组数据存入硬盘时,如果我们直接将这个二维数据保存到硬盘中,会照成大量的空间资源浪费,这时我们可以创建一个稀疏数组仅保存这个棋盘中有用的数据,从而减少空间的占用。
思路:
1.遍历二维数据,统计不为0的个数,总共sum个。
2.创建稀疏数组sparseArray[sum+1][3],先将棋盘大小和有效数据个数保存到第一行中
3.遍历二维数组将每个有效数据的行、列、值保存到稀疏数组的每一行中。
4.将稀疏数组保存到硬盘中。
以下为代码实现
import java.io.*;
//稀疏数组的转换
public class SparseArray {
public static void main(String[] args) throws IOException {
//创建一个原始的二维数组11*11
//0:没有棋子,1表示黑子,2表示蓝子
int chessArr1[][] = new int[11][11];
chessArr1[1][2] = 1;
chessArr1[2][3] = 2;
chessArr1[4][3] = 1;
//记录有效棋子个数
int sum = 0;
//输出原始的二维数组
for (int[] row : chessArr1) {
for (int data : row) {
System.out.printf(" %d\t", data);
if (data != 0) {
sum++;
}
}
System.out.println();
}
System.out.println(sum);
// 创建对应的稀疏数组
int sparseArr[][] = new int[sum + 1][3];
//给稀疏数组赋值
sparseArr[0][0] = 11;
sparseArr[0][1] = 11;
sparseArr[0][2] = sum;
//遍历二维数组,将非0的值存放到sparseArr中
int count = 0;//用来记录是第几个非0数据
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++) {
for (int j = 0; j < 3; j++) {
System.out.printf("%d\t", sparseArr[i][j]);
}
System.out.println();
}
/**
* 将稀疏数组保存到硬盘中
*/
FileWriter fw = new FileWriter("F:\\array_preserve.data");
for (int i = 0; i < sparseArr.length; i++) {
for (int j = 0; j < 3; j++) {
fw.write(sparseArr[i][j]);
}
}
fw.close();
/**
* 从硬盘中读取稀疏数组
*/
FileReader fr=new FileReader("F:\\array_preserve.data");
for (int i = 0; i < sparseArr.length; i++) {
for (int j = 0; j < 3; j++) {
System.out.print(fr.read());
System.out.print(" ");
}
System.out.println();
}
/**
* 将稀疏数组返回原来的数组
*/
//1.先读取稀疏数组第一行
int chessArr2[][] = new int[sparseArr[0][0]][sparseArr[0][1]];
//
for (int i = 1; i < sparseArr.length; i++) {//sparseArr.length行
chessArr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
}
for (int i = 0; i < chessArr1.length; i++) {
for (int j = 0; j < chessArr2[i].length; j++) {
System.out.printf("%d\t", chessArr2[i][j]);
}
System.out.println();
}
}
}