1.先看一个实际需求

  编写一个五子棋,有存棋盘和退棋盘的功能。

  二维数组表示:假设1代表黑子,2代表蓝子,有一个问题:有许多的空是没有棋的,默认为0,所以二维数组会存入0,这样会有许多没有用的内存,因此记录了许多无用的数据。所以用稀疏数组可以进行存储数据;

2.稀疏数组

  基本介绍

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

  稀疏数组的处理方法是:

  1. 记录数组一共共有几行几列,有多少个不同的值。
  2. 把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模。      

  

 

 

  二维数组与稀疏数组的比较(左二维)

 

应用实例

  1. 使用稀疏数组,来保留类似前面的二维数组 (棋盘、地图等)。
  2. 把稀疏数组存盘,并且可以从新恢复原来的二维数组数。
  3. 整体思路:

  4.代码:  

package 稀疏数组;

public class SparseArray {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        //创建一个原始数组为11*11
        //0表示没有棋子,1表示黑子,2表示蓝字,特别说明,int型数据类型在声明的时候没有赋值默认为0;
        int chessArr1[][] = new int[11][11];
        chessArr1[1][1] = 1;
        chessArr1[2][3] = 2;
        //输出原来的数组
        System.out.println("输出原来的数组~~:");
        for(int row[] :chessArr1) {
            for(int data:row) {
                System.out.printf("%d\t",data);
            }
            System.out.println();
        }
        //将二维数组转为稀疏数组
        //1.先遍历二维数组,得到非0的个数
        int sum=0;
        for (int i=0; i<11;i++) {
            for(int j=0;j<11;j++) {
                if(chessArr1[i][j]!=0)
                    sum++;
            }
        }
        //2.创建对应的稀疏数组
        int sparseArr[][] = new int[sum+1][3];
        //给稀疏数组赋值
        sparseArr[0][0] = 11;
        sparseArr[0][1] = 11;
        sparseArr[0][2] = sum;
        int count = 0;
        //遍历二维数组,
        for (int i=0; i<11;i++) {
            for(int j=0;j<11;j++) {
                if(chessArr1[i][j]!=0) {
                    count++;
                    sparseArr[count][0]=i;
                    sparseArr[count][1]=j;
                    sparseArr[count][2]=chessArr1[i][j];
                }
            }
        }
        //输出稀疏数组的形式
        System.out.println();
        System.out.println("得到的稀疏数组为~~");
        for(int i=0;i<sparseArr.length;i++) {
            System.out.printf("%d\t%d\t%d\n",sparseArr[i][0],sparseArr[i][1],sparseArr[i][2]);
        }        
    }
}

 

总结:通过对java的稀疏数组的学习,知晓了如何通过稀疏数组去存储二维数组的数据,减少内存的浪费。

   并且在对于五子棋的现在实现思路是:

  1. 现在能想到的实现五子棋的效果和界面就是通过swing组件中的面板去实现五子棋的每一个格子。
  2. 并且对于落子的顺序是鼠标每次在棋盘上点击一次就会改变下一次点击到面板所改变的样式。

在对于java的学习中没有充分的认识到专业的重要性,并且没有在实际的学习中去充分的学习组件、操作、异常等等知识,到现在学习还要重新回到之前的知识学习中。在接下来的学习中要充分的消化和理解避免做无用功。

 

怀挺!怀挺!怀挺!!!

    

      

posted on 2020-11-17 23:01  ZOne=w=  阅读(87)  评论(0编辑  收藏  举报