稀疏数组

  • 当一个数组中大部分元素为零,或者为同一值的数组时,可以使用稀疏数组来保存该数组。

  • 稀疏数组处理的方式是:

    • 记录数组一共有几行几列,有多少个不同类型的值

    • 把具有不同值的元素和行列及值记录在一个小规模的数组中,从而缩小程序的规模

Practice

  • 需求:编写五子棋游戏,有存盘退出和续上盘的功能

  • 分析问题:因为该二维数组的很多值是默认值0,因此记录了很多没有意义的数据

  • 解决:稀疏数组

 1 package com.Xujie.Day10;
 2 
 3 public class Java10_11 {
 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) {
13             for (int anInt:ints) {
14                 System.out.print(anInt+"\t");
15             }
16             System.out.println();
17         }
18         System.out.println("====================");
19         //转化为稀疏数组保存
20         //1.获取有效值的个数
21         int sum=0;
22         for (int i = 0; i < 11; i++) {
23             for (int j = 0;  j< 11; j++) {
24                 if (array1[i][j]!=0){
25                     sum++;
26                 }
27             }
28         }
29         //2.创建一个稀疏数组的数组
30         int[][]array2=new int[sum+1][3];
31         array2[0][0]=11;
32         array2[0][1]=11;
33         array2[0][2]=sum;
34         //遍历二维数组,将非零的值,存放在二维数组中
35         int count=0;
36         for (int i = 0; i < array1.length; i++) {
37             for (int j = 0; j < array1[1].length; j++) {
38                 if (array1[i][j]!=0){
39                     count++;
40                     array2[count][0]=i;
41                     array2[count][1]=j;
42                     array2[count][2]=array1[i][j];
43                 }
44             }
45         }
46         //输出稀疏数组
47         System.out.println("稀疏数组");
48         for (int i = 0; i < array2.length; i++) {
49             System.out.println(array2[i][0]+"\t"+array2[i][1]+"\t"+array2[i][2]+"\t");
50         }
51         System.out.println("=================");
52         System.out.println("还原");
53         //1. 读取稀疏数组
54         int[][]array3=new int[array2[0][0]][array2[0][1]];
55         //2. 给其中元素还原他的值
56         for (int i = 1; i < array2.length; i++) {
57             array3[array2[i][0]][array2[i][1]]=array2[i][2];
58         }
59         //3. 打印
60         for (int[] ints:array1) {
61             for (int anInt:ints) {
62                 System.out.print(anInt+"\t");
63             }
64             System.out.println();
65         }
66     }
67 
68 }