Java教程

Java数组:稀疏数组

本文主要是介绍Java数组:稀疏数组,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

稀疏数组

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

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

  • 稀疏数组的处理方式:

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

  • 一个例子

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

  • 分析问题:因为该二维数组的很多默认值为 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数组:稀疏数组的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!