• 微信公众号:美女很有趣。 工作之余,放松一下,关注即送10G+美女照片!

Java数组:稀疏数组

开发技术 开发技术 1周前 (07-22) 8次浏览

稀疏数组

  • 稀疏数组是一种数据结构

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

  • 稀疏数组的处理方式:

    • 记录数组一共有几行几列,有多少个不同的值
    • 把具有不同值的元素的 行列值记录在一个小规模的数组中
  • 如下图:左边是原始数组,右边是稀疏数组。

Java数组:稀疏数组

  • 一个例子

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

Java数组:稀疏数组

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

  • 解决:稀疏数组

package com.wanggenji.array;

public class ArrayDemo08 {
    public static void main(String[] args) {
        //1. 创建一个二维数组11*11   0:没有棋子  1:黑棋   2:白棋
        int[][] array1 = new int[11][11];
        array1[1][2]=1;
        array1[2][3]=2;


        //打印原始数组
        for (int[] ints : array1) {
            for (int anInt : ints) {
                System.out.print(anInt+"t");
            }
            System.out.println();
        }

        System.out.println("=============这是分割线===========");
        
        //打印压缩之后的数组
        for (int[] ints : compress(array1)) {
            for (int anInt : ints) {
                System.out.print(anInt+"t");
            }
            System.out.println();
        }

        System.out.println("=============这是分割线===========");
      
        //打印解压还原之后的数组
        int[][] a =compress(array1);
        for (int[] ints : decompressed(a)) {
            for (int anInt : ints) {
                System.out.print(anInt+"t");
            }
            System.out.println();
        }
    }


    //压缩方法的实现
    public static int[][] compress(int[][] array) {
        int count0 = 0;//零的个数
        int count1 = 0;//非零元素个数
        //计算值为零的元素的个数和非零元素的个数
        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array[i].length; j++) {
                if (array[i][j]==0){
                    count0++;
                }else {
                    count1++;
                }
            }
        }

        //创建稀疏数组
        int[][] comperssedArray = new int[count1+1][3];
        //稀疏数组第一行赋值
        comperssedArray[0][0] = array.length;
        comperssedArray[0][1] = array[0].length;
        comperssedArray[0][2] = count0;

        //特殊元素保存
        count1 = 1; //稀疏数组的第二行开始是特殊元素的信息
        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array[i].length; j++) {
                if (array[i][j]!=0){
                    comperssedArray[count1][0] = i;
                    comperssedArray[count1][1] = j;
                    comperssedArray[count1][2] = array[i][j];
                    count1++; //换行存下一个特殊元素信息
                }
            }
        }

        return comperssedArray;
    }

    //解压方法的实现    稀疏数组转化为 普通二维数组
    public static int[][] decompressed(int[][] array) {
        int[][] decompressedArray = new int[array[0][0]][array[0][1]]; //稀疏数组第一行储存的数据:行 列 重复数据个数,由此创建成原来的数组
        //原数组特殊数据还原
        for (int i = 1; i < array.length; i++) {
            decompressedArray[array[i][0]][array[i][1]] = array[i][2];
        }

        return decompressedArray;
    }
}

程序员灯塔
转载请注明原文链接:Java数组:稀疏数组
喜欢 (0)