10.稀疏数组

稀疏数组:它是一种数据结构。
 
需求:编写五子棋游戏,有存盘退出和续上盘的功能。
假设我们要用数组记录棋盘,我们可以将棋盘用0(格子),1(黑棋),2(白棋)代替。
分析问题:因为该二维数组的很多默认值都是0,因此记录了很多没有意义的数据。那么都是0的我们可以将其干掉。因此可以使用一种压缩算法,这样可以让我们的数据量变少。你要存一堆0这样是没有意义的。怎么压缩呢?
解决:稀疏数组
 
稀疏数组介绍:
 
  当一个数组中的大部分元素为0,或者为同一值的数组时,可以使用稀疏数组来保护该数组。
稀疏数组的处理方式是:
  记录数组一共有几行几列,有多少个不同值。把具有不同值的元素和行列及值记录在一个小规模的数组中,从而缩小程序的规模;
 
如下图:左边是原始数组,右边是稀疏数组
  1 package com.duan.array;
  2 
  3 public class ArrayDemo08 {
  4     public static void main(String[] args) {
  5         //1.创建一个二维数组 11*11 0:没有棋子 1:黑棋   2:白棋
  6         int[][] array1 = new int[11][11];
  7         array1[1][2] = 1;
  8         array1[2][3] = 2;
  9         //输出原始的数组
 10         System.out.println("输出原始的数组");
 11 
 12         for (int[] ints : array1) {//for each 增强for循环 快捷键:array1.for
 13             for (int anInt : ints) {//ints.for
 14                 System.out.print(anInt + "\t");
 15             }
 16             System.out.println();
 17         }
 18 
 19         System.out.println("=====================");
 20         //转换为稀疏数组保存
 21         //获取有效值的个数
 22         int sum = 0;
 23         for (int i = 0; i < 11; i++) {
 24             for (int j = 0; j < 11; j++) {
 25                 if (array1[i][j] != 0) {
 26                     sum++;
 27                 }
 28             }
 29         }
 30         System.out.println("有效值的个数:" + sum);
 31 
 32 
 33         //2.创建一个稀疏数组的数组
 34         int[][] array2 = new int[sum + 1][3];
 35 
 36         array2[0][0] = 11;
 37         array2[0][1] = 11;
 38         array2[0][2] = sum;
 39 
 40         //遍历二维数组,将非零的值,存放稀疏数组中
 41         int count = 0;
 42         for (int i = 0; i < array1.length; i++) {
 43             for (int j = 0; j < array1[i].length; j++) {
 44                 if (array1[i][j] != 0) {
 45                     count++;
 46                     array2[count][0] = i;
 47                     array2[count][1] = j;
 48                     array2[count][2] = array1[i][j];
 49 
 50                 }
 51             }
 52         }
 53 
 54         //输出稀疏数组
 55         System.out.println("稀疏数组");
 56 
 57         for (int i = 0; i < array2.length; i++) {
 58             System.out.println(array2[i][0] + "\t"
 59                     + array2[i][1] + "\t"
 60                     + array2[i][2] + "\t");
 61         }
 62 
 63         System.out.println("=====================");
 64         //还原稀疏数组
 65         //1.读取稀疏数组
 66         int[][] array3 = new int[array2[0][0]][array2[0][1]];
 67         //2.给其他的元素还原它的值
 68         for (int i = 1; i < array2.length; i++) {
 69             array3[array2[i][0]][array2[i][1]] = array2[i][2];
 70         }
 71         //3.打印看一下
 72         System.out.println("输出还原的数组");
 73 
 74         for (int[] ints : array3) {//for each 增强for循环 快捷键:array3.for
 75             for (int anInt : ints) {//ints.for
 76                 System.out.print(anInt + "\t");
 77             }
 78             System.out.println();
 79         }
 80     }
 81 }
 82 
 83 结果:
 84 输出原始的数组
 85 0    0    0    0    0    0    0    0    0    0    0    
 86 0    0    1    0    0    0    0    0    0    0    0    
 87 0    0    0    2    0    0    0    0    0    0    0    
 88 0    0    0    0    0    0    0    0    0    0    0    
 89 0    0    0    0    0    0    0    0    0    0    0    
 90 0    0    0    0    0    0    0    0    0    0    0    
 91 0    0    0    0    0    0    0    0    0    0    0    
 92 0    0    0    0    0    0    0    0    0    0    0    
 93 0    0    0    0    0    0    0    0    0    0    0    
 94 0    0    0    0    0    0    0    0    0    0    0    
 95 0    0    0    0    0    0    0    0    0    0    0    
 96 =====================
 97 有效值的个数:2
 98 稀疏数组
 99 11    11    2    
100 1    2    1    
101 2    3    2    
102 =====================
103 输出还原的数组
104 0    0    0    0    0    0    0    0    0    0    0    
105 0    0    1    0    0    0    0    0    0    0    0    
106 0    0    0    2    0    0    0    0    0    0    0    
107 0    0    0    0    0    0    0    0    0    0    0    
108 0    0    0    0    0    0    0    0    0    0    0    
109 0    0    0    0    0    0    0    0    0    0    0    
110 0    0    0    0    0    0    0    0    0    0    0    
111 0    0    0    0    0    0    0    0    0    0    0    
112 0    0    0    0    0    0    0    0    0    0    0    
113 0    0    0    0    0    0    0    0    0    0    0    
114 0    0    0    0    0    0    0    0    0    0    0    

猜你喜欢

转载自www.cnblogs.com/duanfu/p/12222441.html
10.