3.稀疏数组

1.实际需求

五子棋程序中有存盘和复盘的功能。


image.png

2.分析问题

使用二维数组来存的话,会有很多默认的0值,也就是没有意义的值,此时需要引入稀疏数组来解决。

3.稀疏数组介绍

当一个数组中大部分元素的值为0,或者大部分元素的值相同时,可以使用稀疏数组来保存该数组中的元素。
稀疏数组是怎么设计的?
1.它是行数不确定,3列的一个数组。
2.第一行记录原始二维数组有多少行,多少列和多少个不同的值。
3.其它行用来记录这些值在二维数组的行,列和值。
例如:


image.png
  • 稀疏数组第一行记录了目标二维数组中有6行,7列,8个不同的值(不包含0).
  • 第二行记录了22在二维数组中的行、列、值。

4.代码实现

image.png
4.1思路分析
  • 二维数组转稀疏数组:
    1.遍历原始二维数组,找出数组中有效值个数sum.
    2.根据sum创建稀疏数组sparseArr = new int[sum+1][3]
    3.将二维数组中元素信息写到稀疏数组中
  • 稀疏数组转二维数组
    1.根据稀疏数组第一行值创建二维数组,例如chessArr = new int[11][11].
    2.读取稀疏数组后几行数据赋值给二维数组即可。
package com.yc.day01;

import java.util.Arrays;

/**
 * 练习二维数组转稀疏数组
 * */
public class SparseArr {
    public static void main(String[] args) {
        int chessArr[][] = new int[11][11];
        chessArr[1][2] = 1;
        chessArr[2][3] = 2;
        System.out.println("原始二维数组:");
        printArr(chessArr);
        System.out.println("稀疏数组:");
        int[][] sparseArr = chessArrToSparseArr(chessArr);
        printArr(sparseArr);
        System.out.println("稀疏转二维数组:");
        int[][] newChessArr = sparseArrToChessArr(sparseArr);
        printArr(newChessArr);

    }
    /**二维数组转稀疏数组*/
    public static int[][] chessArrToSparseArr(int[][] chessArr){
        int sum = getValidNumCount(chessArr);
        int sparseArr[][] = new int[sum+1][3];
        setSparseValue(chessArr,sparseArr,sum);
        return sparseArr;
    }
    /**稀疏数组转二维数组*/
    public static int[][] sparseArrToChessArr(int[][] sparseArr){
        int row = sparseArr[0][0];
        int col = sparseArr[0][1];
        int[][] chessArr = new int[row][col];
        for(int i =1;i<sparseArr.length;i++){
            chessArr[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
        }
        return chessArr;
    }
    /**打印数组*/
    public static void  printArr(int[][] chessArr){
        for (int i = 0; i < chessArr.length; i++) {
            for (int j = 0; j < chessArr[0].length; j++) {
                System.out.print(chessArr[i][j]+"\t");
            }
            System.out.println();
        }
    }
    /**获取二维数组中不为0的值的个数*/
    public static int getValidNumCount(int[][] chessArr){
        int count = 0;
        for (int i = 0; i < chessArr.length; i++) {
            for (int j = 0; j < chessArr[0].length; j++) {
               if(chessArr[i][j]!=0){
                   count++;
               }
            }
        }
        return count;
    }
    /**设置稀疏数组值*/
    public static void setSparseValue(int[][] chessArr,int[][] sparseArr,int sum){
        sparseArr[0][0] = chessArr.length;
        sparseArr[0][1] = chessArr[0].length;
        sparseArr[0][2] = sum;
        int count = 0;
        for (int i = 0; i < chessArr.length; i++) {
            for (int j = 0; j < chessArr[0].length; j++) {
                if(chessArr[i][j]!=0){
                    count++;
                    sparseArr[count][0] = i;
                    sparseArr[count][1] = j;
                    sparseArr[count][2] = chessArr[i][j];
                }
            }
        }
    }
}

image.png
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容