关于稀疏数组的的一些思考
1.什么是稀疏数组?
当一个二维数组有大量相同的值(比如0,为什么是0呢,因为我们创建出来的int数组默认值为0,存储了很多没有意义的值)的时候,可以转换成稀疏数组来存储,可以大量节省存储空间,例如一个11*11的二维数组甚至可以转换成一个1*1的稀疏数组
2.稀疏数组的实现思路?
计算出远二维数组的行数、列数、不同数值的个数,对应稀疏数组(列数为3)中第一行第一列放行数,第一行第二列放列数、第一行第三列放不同值的个数,复原时根据稀疏数组中存储的值,构建出原二维数组即可。
思考:若果大量重复的值不是0,而是其他值呢?
我们可以在稀疏数组的第一行第三列存储这个大量重复的值,
在复原会原始数组时,可以将没有填充特殊值的位置都设置为这个大量重复的值
3.优点
缩小数据的规模,压缩数据,比如五子棋盘、地图,大量的无意义数值导致数组规模过大,改用稀疏数组存储的话,可以大量节省空间。
4.原始二维数组与对应稀疏数组对比:可见规模缩小了3倍左右

5.代码实现-可运行
import java.io.*;
public static void main(String[] args) {
int chessArr[][] = new int[11][11];
chessArr[1][2] = 2;
chessArr[6][8] = 6;
for (int rowArr[] : chessArr){
for (int num : rowArr){
System.out.print(num + " ");
}
System.out.print("\n");
}
//计算总行数 总列数 总共有多少不同的值
int col = 0;
int row = 0;
int numOfdiffInt = 0;
for (int a[] : chessArr){
row++;
if (col == 0){
for (int tmp : a){
col++;
}
}
for (int tmp : a){
if ( 0 != tmp){
numOfdiffInt++;
}
}
}
int parseArr[][] = new int[numOfdiffInt + 1][3];
//将不同的值写入稀疏数组
int t = 0;
int num2 = 0;
for (int bb[] : chessArr){
for (int i = 0 ; i < col; i ++){
if ( 0 != bb[i]){
num2++;
parseArr[num2][0] = t;
parseArr[num2][1] = i;
parseArr[num2][2] = bb[i];
}
}
t++;
}
parseArr[0][2] = numOfdiffInt;
parseArr[0][0] = row;
parseArr[0][1] = col;
System.out.print("打印稀疏数组*****************\n");
for (int aa[] : parseArr){
for (int tmp : aa){
System.out.print(tmp + " ");
}
System.out.print("\n");
}
//练习写文件操作,将转换出的稀疏数组存入文件中
File file = new File("/Users/11085347/Desktop/sparseArr.txt");
try {
file.delete();
file.createNewFile();
BufferedWriter writer = new BufferedWriter(new FileWriter(file));
for (int write[] : parseArr){
String tmpWrite = "";
for (int tmp: write){
tmpWrite += tmp + ",";
}
tmpWrite = tmpWrite.substring(0,tmpWrite.lastIndexOf(",") );
tmpWrite += "\r\n";
writer.write(tmpWrite);
}
writer.flush();
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
//取出文件中的稀疏数组
try {
FileInputStream fileInputStream = new FileInputStream(file);
InputStreamReader reader = new InputStreamReader(fileInputStream);
BufferedReader bufferedReader = new BufferedReader(reader);
String line = bufferedReader.readLine();
while (line != null){
System.out.println(bufferedReader.readLine());
line = bufferedReader.readLine();
}
} catch (Exception e){
System.out.print(e);
}
//将稀疏数组转为原来数组
System.out.print("*****************\n");
int originRow = parseArr[0][0];
int originCol = parseArr[0][1];
int originArr[][] = new int[originRow][originCol];
for (int i = 1 ; i <= parseArr[0][2] ; i++){
int indexRow = parseArr[i][0];
int indexCol = parseArr[i][1];
int value = parseArr[i][2];
originArr[indexRow][indexCol] = value;
}
for (int a[] : originArr){
for (int b : a){
System.out.print(b + " ");
}
System.out.print("\n");
}
}