稀疏数组的使用场景
- 当一个数组中大部分元素为0,或者为同一值的数组时,可以使用稀疏数组来保存该数组。
- 稀疏数组的处理方式是:记录数组一共有几行几列,有多少个不同值;把具有不同值的元素和行列及值记录在一个小规模的数组中,从而缩小程序的规模
结果分析:
原始的二维数组
0 0 0 0 0 0
0 0 1 0 0 0
0 0 0 1 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
生成的稀疏数组
11 6 3
1 2 1
2 3 1
3 4 2
还原的二维数组
0 0 0 0 0 0
0 0 1 0 0 0
0 0 0 1 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
代码实现:
@Slf4j
public class SparseArray {
public static void main(String[] args) {
arrSparseArrTransfer();
}
public static void arrSparseArrTransfer() {
int[][] chessArr1 = new int[11][6];
chessArr1[1][2] = 1;
chessArr1[2][3] = 1;
chessArr1[3][4] = 2;
System.out.println("原始的二维数组");
print(chessArr1);
int[][] sparseArray = createSparseArray(chessArr1);
restorechessArr(sparseArray);
}
private static int[][] createSparseArray(int[][] chessArr1) {
int count = 0;
for (int[] ints : chessArr1) {
for (int anInt : ints) {
if (anInt != 0) {
count++;
}
}
}
int[][] sparseArr = new int[count + 1][3];
int[] headArr = {chessArr1.length, chessArr1[0].length, count};
sparseArr[0] = headArr;
int index = 1;
for (int i1 = 0; i1 < chessArr1.length; i1++) {
for (int i2 = 0; i2 < chessArr1[i1].length; i2++) {
if (chessArr1[i1][i2] != 0) {
sparseArr[index] = new int[]{i1, i2, chessArr1[i1][i2]};
index++;
}
}
}
System.out.println("生成的稀疏数组");
print(sparseArr);
return sparseArr;
}
private static void restorechessArr(int[][] sparseArray) {
int[][] newChessArr = new int[sparseArray[0][0]][sparseArray[0][1]];
for (int i = 0; i < sparseArray.length; i++) {
if (i != 0) {
newChessArr[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2];
}
}
System.out.println("还原的二维数组");
print(newChessArr);
}
private static void print(int[][] sparseArr) {
for (int[] row : sparseArr) {
for (int data : row) {
System.out.printf("%d\t", data);
}
System.out.println();
}
}
}