应用场景:当一个数组中大部分元素相同时。可以使用稀疏数组来保存改该数组。从而达到节约存储空间的效果。
代码和思路:
public class SparseArray {
public static void main(String[] args) throws IOException {
/**
* 二维数组转稀疏数组的思路解析
* 1.遍历原始的二维数组。得到有数据的个数sum
* 2.根据有效个数确定稀疏数组的大小。
* 3.将二维数组的有效数据保存到稀疏数组
*/
//原始的二维数组 11*11
//0表示没有棋子 1表示黑子 2表示蓝子
int chessArray1[][] = new int[11][11];
chessArray1[1][2] = 1;
chessArray1[2][3] = 2;
chessArray1[4][8] = 2;
//输出原始的二维数组
System.out.println("原始二维数组:");
for (int[] row : chessArray1) {
for (int data : row) {
System.out.printf("%d\t", data);
}
System.out.println();
}
//1.先遍历二维数组 得到非0数据的个数
int sum = 0;
for (int i = 0; i < chessArray1.length; i++) {
for (int j = 0; j < chessArray1[i].length; j++) {
if (chessArray1[i][j] > 0) {
sum++;
}
}
}
//2.创建对应的稀疏数组(第一行记录二维数组的大小。所以大小应该是总个数+1);
int sparseArr[][] = new int[sum + 1][3];
//第一行记录二维数组的大小。
sparseArr[0][0] = chessArray1.length;//行数
sparseArr[0][1] = chessArray1[0].length;//列数
sparseArr[0][2] = sum;//不为0的总个数。
//遍历二维数组,将保存的值存放到稀疏数组中
int count = 0;
for (int i = 0; i < chessArray1.length; i++) {
for (int j = 0; j < chessArray1[i].length; j++) {
if (chessArray1[i][j] > 0) {
count++;
sparseArr[count][0] = i;
sparseArr[count][1] = j;
sparseArr[count][2] = chessArray1[i][j];
}
}
}
//输出稀疏数组的形式
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]);
}
/**
* 稀疏数组转原始的二维数组思路:
* 1.先读取稀疏数组的第一行,根据第一行的数据确定原始二维数组的大小并创建。
* 2.读取稀疏数组后几行的数据,并赋给原始的二维数组。
*/
//将稀疏数组还原成原始的二维数组。
//1.先读取稀疏数组的第一行,根据第一行的数据,创建指定大小的原始二维数组。
int[][] chessArray2 = new int[sparseArr[0][0]][sparseArr[0][1]];
//2.把稀疏数组后面几行的(从第二行开始)值赋给二维数组。
for (int i = 1; i < sparseArr.length; i++) {
chessArray2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
}
//恢复后的二维数组
System.out.println("恢复后的二维数组:");
for (int[] row : chessArray2) {
for (int data : row) {
System.out.printf("%d\t", data);
}
System.out.println();
}
/**
* IO流实现存档思路:
* 1.创建文件
* 2.把稀疏素组的内容用逗号和换行符拼接成字符串的方式保存到文件中。
*/
//创建文件
BufferedWriter bw = new BufferedWriter(new FileWriter("d:array.txt"));
StringBuilder sb = new StringBuilder();
//把稀疏数组的内容转换成字符串。用,分割。
for (int i = 0; i < sparseArr.length; i++) {
sb.append(sparseArr[i][0] + "," + sparseArr[i][1] + "," + sparseArr[i][2]);
//如果不是数组的最后一行内容则用换行符来区分。
if (i != sparseArr.length - 1) {
sb.append("\n");
}
}
//字符串保存到文件
bw.write(sb.toString());
bw.close();
/**
* IO流实现读档思路
* 1.读取文件第一行的内容。创建数组。。
* 2.读取文件后面几行的内容。赋值给二维数组
*/
BufferedReader br = new BufferedReader(new FileReader("d:array.txt"));
//读取文本文件的第一行。用来创建二维数组。
String firstLine = br.readLine();
//用逗号分割第一行内容。
String[] strs = firstLine.split(",");
//根据分割内容创建二维数组
int[][] chessArray3 = new int[Integer.parseInt(strs[0])][Integer.parseInt(strs[1])];
while (true) {
//读取下一行内容
String content = br.readLine();
//如果内容为null则结束循环。
if (content == null) {
break;
}
String[] strs1 = content.split(",");
//根据分割的内容设置二维数组。
chessArray3[Integer.parseInt(strs1[0])][Integer.parseInt(strs1[1])] = Integer.parseInt(strs1[2]);
}
System.out.println("根据存档内容恢复的二维数组:");
for (int[] row : chessArray3) {
for (int data : row) {
System.out.printf("%d\t", data);
}
System.out.println();
}
}
}