​当二维数组中有大量的0时,可以用稀疏数组对二位数组进行压缩存储,稀疏数组可以大大的节省存储空间​

如:
​​​普通二维数组​

0   0   0   0   0   0   0   0   0   0   0   
0 0 0 0 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0 0 0 0
0 0 0 0 2 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0

​转为稀疏数组时​

11  11  3   
2 3 1
3 4 2
8 9 1

​稀疏数组的格式​

二维数组的行数 二维数组的列数 非零元素的个数
行坐标 列坐标
行坐标 列坐标
行坐标 列坐标
......
行坐标 列坐标

将二维数组转为稀疏数组并存储到文件中
将文件中存储的稀疏数组取出来,再转换为二维数组

package com.whb.sparsearray;

import java.io.*;

public class SparseArray {


public static void main(String[] args) {

int[][] arr = new int[11][11];

arr[2][3] = 1;
arr[3][4] = 2;
arr[8][9] = 1;

for (int i=0; i < arr.length; i++){
for (int j=0; j < arr[0].length; j++){

System.out.printf("%d\t",arr[i][j]);
}
System.out.println();
}

int sum = 0;

for (int i = 0; i < 11; i++) {

for (int j = 0; j < 11; j++) {

if(arr[i][j]!=0){
sum++;
}
}

}

/**
* 矩阵转稀疏数组
*/
int[][] sparseArr = new int[sum+1][3];
sparseArr[0][0] = arr.length;
sparseArr[0][1] = arr[0].length;
sparseArr[0][2] = sum;

int count = 1;

for (int i = 0; i < 11; i++) {
for (int j = 0; j < 11; j++) {
if(arr[i][j]!=0){
sparseArr[count][0] = i;
sparseArr[count][1] = j;
sparseArr[count][2] = arr[i][j];
count++;
}
}
}

System.out.println();

// for (int i = 0; i < sparseArr.length; i++) {
// for (int j = 0; j < sparseArr[0].length; j++) {
// System.out.printf("%d\t",sparseArr[i][j]);
// }
// System.out.println();
// }
// System.out.println();

// 写入
try {
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("./data.txt")));
for (int i = 0; i < sparseArr.length; i++) {
for (int j = 0; j < sparseArr[i].length; j++) {
if(j!=sparseArr[i].length-1){
bw.write(sparseArr[i][j]+" ");
}else{
bw.write(sparseArr[i][j]+"");
}
}
if(i!=sparseArr.length-1){

bw.newLine();
}
}
bw.flush();
} catch (Exception e) {

}

int[][] readarr = null;
//读取
try {
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("./data.txt")));
String firstLine = br.readLine();
String[] sarr = firstLine.split(" ");

readarr = new int[Integer.parseInt(sarr[0])][Integer.parseInt(sarr[1])];

String s = null;
while ((s = br.readLine())!=null){
sarr = s.split(" ");
readarr[Integer.parseInt(sarr[0])][Integer.parseInt(sarr[1])] = Integer.parseInt(sarr[2]);
}

} catch (Exception e) {

}
System.out.println("开始打印");

for (int i = 0; i < readarr.length; i++) {
for (int j = 0; j < readarr[0].length; j++) {
System.out.printf("%d\t",readarr[i][j]);
}
System.out.println();
}


// /**
// * 稀疏数组转矩阵
// */
//
// int[][] newArr = new int[sparseArr[0][0]][sparseArr[0][1]];
// for (int i = 1; i < sparseArr.length; i++) {
//
// newArr[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
//
// }
//
//
// for (int i = 0; i < newArr.length; i++) {
// for (int j = 0; j < newArr[0].length; j++) {
// System.out.printf("%d\t",newArr[i][j]);
// }
// System.out.println();
// }
}

}