使用场景
二维数组中大部分元素为同一个值,且这些值没有什么意义,可以考虑压缩。
比如棋盘、地图等。
数组 转化为 稀疏数组
行数不确定、但是列是3列的动态数组。
1.记录数组一共有几行几列
2.有多少不同的值
3.把不同值的行列及值记录在一个小规模的数组中
比如:

1.[0]记录一共有几行几列,有多少不同的值
2.[1][2]…记录不同的值的行列和值
结果:67的数组缩小到93
思路
- 遍历原始的二维数组,得到有效元素的个数sum
- 根据sum创建稀疏数组 int[sum+1][3]
- 初始化稀疏数组第一行
- 遍历二维数组,将二维数组的有效数据存入稀疏数组
稀疏数组 恢复成 二维数组
1.先读取稀疏数组的第一行,创建原始二维数组 int[row][col]
2.再读取有效值的数据,并赋值给二维数组
代码
package com.lx.sparseArray;import java.lang.reflect.Array;/*** @author Shae Lin* @ClassName: SparseArray* @Description:* @Date: 2022 06 2022/6/28 10:59 上午**/public class SparseArray {public static void main(String[] args) {//创建一个原始的二维数组 11*11//0:表示没有 1:黑子 2:蓝子int chessArr[][] = new int[11][11];chessArr[1][2] = 1;chessArr[2][3] = 2;//输出二维数组for (int[] row:chessArr){for (int data : row){System.out.printf("%d\t", data);}System.out.println();}//1.遍历原始的二维数组,得到有效元素的个数sumint sum = 0;for (int i = 0;i<11;i++){for (int j = 0;j<11;j++){if (chessArr[i][j] != 0){sum++;}}}//2.根据sum创建稀疏数组 int[sum+1][3]int sparseArray[][] = new int[sum+1][3];//3.初始化稀疏数组第一行sparseArray[0][0] = 11;sparseArray[0][1] = 11;sparseArray[0][2] = sum;//4.遍历二维数组,将二维数组的有效数据存入稀疏数组int row = 1;for (int i = 0; i<11;i++){for (int j = 0;j<11;j++){if (chessArr[i][j] != 0){sparseArray[row][0] = i;sparseArray[row][1] = j;sparseArray[row][2] = chessArr[i][j];row++;}}}//输出稀疏数组for (int i = 0; i < sparseArray.length; i++) {System.out.printf("%d\t%d\t%d\t\n",sparseArray[i][0],sparseArray[i][1],sparseArray[i][2]);}//恢复原始二维数组//1.先读取稀疏数组的第一行,创建原始二维数组 int[row][col]//2.再读取有效值的数据,并赋值给二维数组int[][] initArray = new int[sparseArray[0][0]][sparseArray[0][1]];for (int i = 1; i < sparseArray.length; i++) {initArray[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2];}//输出原始数组for (int i = 0; i < 11; i++) {for (int j = 0; j < 11; j++) {System.out.printf("%d\t",initArray[i][j]);}System.out.println();}}}
