使用场景

二维数组中大部分元素为同一个值,且这些值没有什么意义,可以考虑压缩。
比如棋盘、地图等。

数组 转化为 稀疏数组

行数不确定、但是列是3列的动态数组。

1.记录数组一共有几行几列
2.有多少不同的值
3.把不同值的行列及值记录在一个小规模的数组中

比如:

image.png

1.[0]记录一共有几行几列,有多少不同的值
2.[1][2]…记录不同的值的行列和值
结果:67的数组缩小到93

思路

  1. 遍历原始的二维数组,得到有效元素的个数sum
  2. 根据sum创建稀疏数组 int[sum+1][3]
  3. 初始化稀疏数组第一行
  4. 遍历二维数组,将二维数组的有效数据存入稀疏数组

稀疏数组 恢复成 二维数组

1.先读取稀疏数组的第一行,创建原始二维数组 int[row][col]
2.再读取有效值的数据,并赋值给二维数组

代码

  1. package com.lx.sparseArray;
  2. import java.lang.reflect.Array;
  3. /**
  4. * @author Shae Lin
  5. * @ClassName: SparseArray
  6. * @Description:
  7. * @Date: 2022 06 2022/6/28 10:59 上午
  8. **/
  9. public class SparseArray {
  10. public static void main(String[] args) {
  11. //创建一个原始的二维数组 11*11
  12. //0:表示没有 1:黑子 2:蓝子
  13. int chessArr[][] = new int[11][11];
  14. chessArr[1][2] = 1;
  15. chessArr[2][3] = 2;
  16. //输出二维数组
  17. for (int[] row:chessArr){
  18. for (int data : row){
  19. System.out.printf("%d\t", data);
  20. }
  21. System.out.println();
  22. }
  23. //1.遍历原始的二维数组,得到有效元素的个数sum
  24. int sum = 0;
  25. for (int i = 0;i<11;i++){
  26. for (int j = 0;j<11;j++){
  27. if (chessArr[i][j] != 0){
  28. sum++;
  29. }
  30. }
  31. }
  32. //2.根据sum创建稀疏数组 int[sum+1][3]
  33. int sparseArray[][] = new int[sum+1][3];
  34. //3.初始化稀疏数组第一行
  35. sparseArray[0][0] = 11;
  36. sparseArray[0][1] = 11;
  37. sparseArray[0][2] = sum;
  38. //4.遍历二维数组,将二维数组的有效数据存入稀疏数组
  39. int row = 1;
  40. for (int i = 0; i<11;i++){
  41. for (int j = 0;j<11;j++){
  42. if (chessArr[i][j] != 0){
  43. sparseArray[row][0] = i;
  44. sparseArray[row][1] = j;
  45. sparseArray[row][2] = chessArr[i][j];
  46. row++;
  47. }
  48. }
  49. }
  50. //输出稀疏数组
  51. for (int i = 0; i < sparseArray.length; i++) {
  52. System.out.printf("%d\t%d\t%d\t\n",sparseArray[i][0],sparseArray[i][1],sparseArray[i][2]);
  53. }
  54. //恢复原始二维数组
  55. //1.先读取稀疏数组的第一行,创建原始二维数组 int[row][col]
  56. //2.再读取有效值的数据,并赋值给二维数组
  57. int[][] initArray = new int[sparseArray[0][0]][sparseArray[0][1]];
  58. for (int i = 1; i < sparseArray.length; i++) {
  59. initArray[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2];
  60. }
  61. //输出原始数组
  62. for (int i = 0; i < 11; i++) {
  63. for (int j = 0; j < 11; j++) {
  64. System.out.printf("%d\t",initArray[i][j]);
  65. }
  66. System.out.println();
  67. }
  68. }
  69. }

存盘

读盘