Java学习12--稀疏数组

稀疏数组的含义:

如果一个数组大部分的值都是0或者相同的数值, 只有少量位置有特殊需要标记的数值,
那么为了省事,一堆0不用存储,只要存储特殊标记的这几个数字就可以了.

举例 左边是原始数组,右边是稀疏数组
Java学习12--稀疏数组_第1张图片
比如这是一个6行7列的数组,其中共有8个有效数据
所以上图右侧第一行[0] 6 7 8 表示[0]归纳总结:这个数组共有6行7列8个有效元素
上图右侧第二行[1] 0 3 22 表示第一个有效数据是第0行 第3列 data值为22

具体来说,类似这样

开始建立稀疏数组
[6行][7列][8个有效数据]
[0行][3列][data值为22]
[0行][6列][data值为15]
[1行][1列][data值为11]

練習:
程序举例
要求随意创建一个数据量不多的数组,并输出这个原始数组
然后输出数组内有效数据的个数,并且输出数组的行数列数
然后输出对应的稀疏数组
最后通过稀疏数组还原到原来的数组

import java.util.Arrays;
public class testjan05{

    public static void main(String[] args) {
        int [][] nums=new int[7][12];
        nums[0][0]=26;
        nums[1][1]=2;
        nums[4][0]=108;
        nums[0][5]=53;
        nums[3][5]=28;
        nums[6][7]=6;
        System.out.println("原数组显示:");

        /**原来数组类似下面这样
         * [26, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0]
         * [0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
         * [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
         * [0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0]
         * [108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
         * [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
         * [0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0]
         */

        for (int[] num : nums) {
            System.out.println(Arrays.toString(num)); //打印原数组
        }
        System.out.println("数组列数"+nums[0].length); //取第0行算出原数组的列数,如果数组有第一行,这里当然也可以选第1行计算数组列数,原理都是一样的
        System.out.println("数组行数"+nums.length); //计算数组的行数

        System.out.println("稀疏数组显示:");
        //这里用的IDEA快捷键,【数组名字.for】 快速生成for循环,主要是用来打印或显示数组内容。
        // 本例需要显示多维数组,于是每次将f_num的一整行视为一个整体块输出
        // 稀疏数组sparse_matrix
        for (int[] f_num : sparse_matrix(nums)) {
            System.out.println(Arrays.toString(f_num));
        }

        System.out.println("原数组反编:");
        for (int[] o_num : org_matrix(sparse_matrix(nums))) {
            System.out.println(Arrays.toString(o_num));
        }

    }


    public static int[][] sparse_matrix(int nums_in [][]) {
        int colume= nums_in.length;//行
        int row= nums_in[0].length;//列
        int data_num = 0;
        int data_con = 0;

        //虽然稀疏数组的列数为固定3列,[0]行角标[1]列角标[2]实际数值
        //但是不清楚原数组有多少个有效数据,那么就无法判断稀疏数组的实际行数。
        //下面的for循环计算出来实际有多少valid data(N), the the final length of sparse matrix should be N+1
        //the first line of the sparse matrix should be [0][0]==org colume [0][1]==org_row [0][2]==total valid data(not 0)
        for (int m = 0; m < row; m++) {
            for (int n = 0; n < colume; n++) {
                if (nums_in[n][m] != 0) {
                    data_con += 1;
                }
            }
        }

        int [][] nums_out=new int[data_con+1][3];
        nums_out[0][0] = colume;
        nums_out[0][1] = row;
        nums_out[0][2] = data_con;
        for (int j = 0; j < row; j++) {
            for (int i = 0; i < colume; i++) {
                if (nums_in[i][j]!=0){
                    data_num+=1;
                    nums_out[data_num][0]=i;
                    nums_out[data_num][1]=j;
                    nums_out[data_num][2]=nums_in[i][j];
                }

            }
        }
        return nums_out;
    }

    public static int[][] org_matrix(int nums_in [][]) {

        int [][]nums_out= new int [nums_in[0][0]][nums_in[0][1]];
        
        for (int i = 1; i <= nums_in[0][2]; i++) {
            nums_out[nums_in[i][0]][nums_in[i][1]] = nums_in[i][2];
        }
        return nums_out;
    }

}

運行結果:

原数组显示:
[26, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0]
[0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0]
[108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0]
数组列数12
数组行数7
稀疏数组显示:
[7, 12, 6]
[0, 0, 26]
[4, 0, 108]
[1, 1, 2]
[0, 5, 53]
[3, 5, 28]
[6, 7, 6]
原数组反编:
[26, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0]
[0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0]
[108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0]

你可能感兴趣的:(java,学习,开发语言)