稀疏数组

1.先看实际需求

编写的五子棋程序中,在存盘退出和续上盘的功能

1672318251542

分析问题:

因为该二维数组的很多值是默认值0,因此记录了很多没有意义的数据,那么该怎么解决呢?稀疏数组。

2.基本介绍

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

稀疏数组的处理方法:

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

1672318668339

3.应用实例

1)使用稀疏数组,来保留类似前面的二维数组(棋盘、地图等等)

2)把稀疏数组存盘,并且可以从新恢复原来的二维数组

1672319180344

代码实现

package com.yt;

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;
        chessArr[4][5] = 2;
        //输出原始的二维数组
        System.out.println("原始的二维数组:");
        for (int[] arr : chessArr){
            for (int data : arr){
                System.out.printf("%d\t",data);
            }
            System.out.println();
        }

        //将二维数组转化为稀疏数组
        //1.先遍历二维数组 得到非0的元素个数
        int sum = 0;
        for (int i=0; i<chessArr.length;i++){
            for (int j = 0; j < chessArr.length; j++) {
                if (chessArr[i][j] != 0){
                    sum++;
                }
            }
        }
        //2.创建对应的稀疏数组
        int[][] sparseArr = new int[sum+1][3];//行数是非0元素个数加1,列数就是3,这个是不变的
        //给稀疏数组的第一行赋值
        sparseArr[0][0] = chessArr.length;
        sparseArr[0][1] = chessArr.length;
        sparseArr[0][2] = sum;//存放非0元素的个数
        //3.遍历原始的二维数组,将非0元素存入稀疏数组中
        int count = 0;//表示将非0元素存到第几行
        for (int i = 0; i < chessArr.length; i++) {
            for (int j = 0; j < chessArr.length; j++) {
                if (chessArr[i][j] != 0){
                    count++;
                    sparseArr[count][0] = i;//记录下非0元素在原始数组中的行标
                    sparseArr[count][1] = j;//记录下非0元素在原始数组中的列标
                    sparseArr[count][2] = chessArr[i][j];//记录下非0元素
                }
            }
        }
        //4.输出稀疏数组
        System.out.println();
        System.out.println("得到的稀疏数组");
        for (int i=0; i<sparseArr.length; i++){
            for (int j = 0; j < sparseArr[i].length; j++) {
                System.out.printf("%d\t" , sparseArr[i][j]);
            }
            System.out.println();
        }


        //另外的知识点:将稀疏数组转化为原始的数组
        //1.先从稀疏数组的第一行得到原始的数组的大小
        int row = sparseArr[0][0];
        int column = sparseArr[0][1];
        //2.创建原始数组的大小
        int[][] origArr = new int[row][column];
        //3.遍历稀疏数组,将对应的位置填入对应的非0元素
        for (int i = 1; i < sparseArr.length; i++) {
            origArr[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
        }
        //3.输出恢复之后的原始数组
        System.out.println();
        System.out.println("恢复之后的数组");
        for (int[] row1 : origArr){
            for (int data : row1){
                System.out.printf("%d\t",data);
            }
            System.out.println();
        }



    }
}

1672377296401

1672378167336

1672378946935

posted @ 2022-12-30 13:44  半路_出家ren  阅读(55)  评论(0编辑  收藏  举报
返回顶端