
上图表示一个原始二维数组的矩阵,如果不用稀疏数组,那么保存记录需要42个数字空间
上图表示二维数组矩阵的稀疏数组形式,经过压缩后,只需要保存24位数字即可
二维数组转稀疏数组的思路
1、遍历原始的二维数组,得到有效数据的个数sum
2、根据sum就可以创建稀疏数组sparseArr int[sum+1][3]
3、将二维数组的有效数据存入到稀疏数组
稀疏数组转原始二维数组的思路
1、根据稀疏数组的第一行数据创建原始的二维数组,比如上面的chessArr2=int[11][11]
2、在读取稀疏数组后几行的数据之后,赋予二维数组即可
代码实现
public class SparseArray {public static void main(String[] args) {SparseArray sparseArray = new SparseArray();int[][] chessArr = new int[11][11];chessArr[2][3] = 2;chessArr[3][4] = 3;int[][] sparseArr = sparseArray.toSparseArr(chessArr);for (int i = 0;i < sparseArr.length;i++){for(int j = 0;j < 3;j++){System.out.print(sparseArr[i][j] + "\t");}System.out.println();}int[][] chessArr2 = sparseArray.toChessArr(sparseArr);for (int i = 0;i < chessArr2.length;i++){for (int j = 0;j < chessArr2[0].length;j++){System.out.print(chessArr2[i][j] + "\t");}System.out.println();}sparseArray.writeInFile(sparseArr);System.out.println("---------------------");sparseArray.readOnFile(new File("map.data"));}//二维转稀疏private int[][] toSparseArr(int[][] chessArr){int count = 0;for (int i = 0;i < chessArr.length;i++){for (int j = 0;j < chessArr[0].length;j++){if (0 != chessArr[i][j]){count++;}}}int[][] sparseArr = new int[count+1][3];sparseArr[0][0] = chessArr.length;sparseArr[0][1] = chessArr[0].length;sparseArr[0][2] = count;count = 0;for (int i = 0;i < chessArr.length;i++){for (int j = 0;j < chessArr[0].length;j++){if (0 != chessArr[i][j]){count ++;sparseArr[count][0] = i;sparseArr[count][1] = j;sparseArr[count][2] = chessArr[i][j];}}}return sparseArr;}//稀疏转二维private int[][] toChessArr(int [][]sparseArr){int[][] chessArr = new int[sparseArr[0][0]][sparseArr[0][1]];for (int i = 1;i < sparseArr.length;i++){chessArr[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];}return chessArr;}//写入文件private void writeInFile(int[][] sparseArr) {FileWriter writer = null;try {writer = new FileWriter(new File("map.data"));for (int i = 0;i < sparseArr.length;i++){for (int j = 0;j < sparseArr[0].length;j++){writer.write(sparseArr[i][j] + "\t");}writer.write("\n");}} catch (IOException e) {e.printStackTrace();}try {writer.close();} catch (IOException e) {e.printStackTrace();}}//从文件中读取private void readOnFile(File file) {FileReader reader = null;try {reader = new FileReader(file);char[] buffer = new char[1024];while (-1 != reader.read(buffer)){for (char c : buffer){System.out.print(c);}}} catch (IOException e) {e.printStackTrace();}try {reader.close();} catch (IOException e) {e.printStackTrace();}}}
