• 稀疏数组一 数组转稀疏数组 稀疏数组恢复


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

    稀疏数组的处理方法;

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

    由7x6的数组转换成3x9的稀疏数组

    package jiegou;
    
    import javax.management.relation.Role;
    import javax.swing.*;
    
    public class SparseArray {
        public static void main(String[] args) {
            // 创建一个原始的二维数组 11*11
            // 0 表示没有 1 黑子 2 蓝子
    
            int row = 11;
            int col = 11;
    
            Sparse sparse = new Sparse();
            int[][] chessArr = sparse.createArray(row,col);
            System.out.println("原始的数组");
            sparse.printArray(chessArr);
    
    
            int[][] sparseArr = sparse.arrayToSparse(chessArr);
            // 输出
            System.out.println("稀疏数组数组");
            sparse.printArray(sparseArr);
    
            // 转行回原始数组
            int[][] oldArr = sparse.sparseToArray(sparseArr);
            // 输出
            System.out.println("还原后的数组");
            sparse.printArray(oldArr);
        }
    }
    
    class Sparse
    {
    
        // 创建一个原始数组
        public int[][] createArray(int row,int col)
        {
            int[][] array = new int[row][col];
            array[1][2] = 1;
            array[2][3] = 2;
            array[3][4] = 2;
            return array;
        }
    
        // 打印二维数组
        public void printArray(int[][] array)
        {
            for(int[] item : array) {
                for(int data : item) {
                    System.out.printf("%d	",data);
                }
                System.out.println();
            }
        }
    
        // 数组转为稀疏数组
        public int[][] arrayToSparse(int[][] chessArr)
        {
            // 遍历原始数组得到有效的非 0 个数
            int sum = 0,row = 0,col=0;
            row = chessArr.length;
            col = chessArr[0].length;
    
            for(int[] item : chessArr) {
                for(int data : item) {
                    if(data != 0 ){
                        sum++;
                    }
                }
            }
            System.out.printf("sum=%d
    ",sum);
    
            // 创建对应的稀疏数组 第三行3是固定的 第一个二个存几行几列  所以行数是个数+1(sum+1)
            int[][] sparseArr = new int[sum+1][3];
            // 给稀疏数组赋值
            sparseArr[0][0] = row; // 总行数
            sparseArr[0][1] = col; // 总列数
            sparseArr[0][2] = sum; // 总数
            //遍历二维数组 将非 0 的值存入到稀疏数组
            // 设置一个计数器 从第二行开始
            int count = 1;
            for(int i=1;i<row;i++){
                for(int j=0;j<col;j++){
                    if(chessArr[i][j] != 0) {
                        sparseArr[count][0] = i; // 这个非 0 所在的行
                        sparseArr[count][1] = j; // 这个非 0 所在的列
                        sparseArr[count][2] = chessArr[i][j]; //值
                        count++;
                    }
                }
            }
    
            return sparseArr;
        }
    
        // 稀疏数组转为正常数组  第一行的第一列是行数 第二个是列数 第三个是非 0 的总数
        public int[][] sparseToArray(int[][] array)
        {
            int row ,col;
            row = array[0][0];
            col = array[0][1];
    
            int[][] arr = new int[row][col];
    
            if(array[0][2] > 0) {
                for(int i=1;i< array.length;i++){
                    for (int j=0;j<3;j++){
                        arr[array[i][0]][array[i][1]] = array[i][2]; // 第三个是值
                    }
                }
            }
    
            return arr;
        }
    }
    
    
    
    /Library/Java/JavaVirtualMachines/jdk1.8.0_231.jdk/Contents/Home/bin/java -javaagent:/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar=65502:/Applications/IntelliJ IDEA.app/Contents/bin -Dfile.encoding=UTF-8 -classpath /Library/Java/JavaVirtualMachines/jdk1.8.0_231.jdk/Contents/Home/jre/lib/charsets.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_231.jdk/Contents/Home/jre/lib/deploy.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_231.jdk/Contents/Home/jre/lib/ext/cldrdata.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_231.jdk/Contents/Home/jre/lib/ext/dnsns.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_231.jdk/Contents/Home/jre/lib/ext/jaccess.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_231.jdk/Contents/Home/jre/lib/ext/jfxrt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_231.jdk/Contents/Home/jre/lib/ext/localedata.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_231.jdk/Contents/Home/jre/lib/ext/nashorn.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_231.jdk/Contents/Home/jre/lib/ext/sunec.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_231.jdk/Contents/Home/jre/lib/ext/sunjce_provider.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_231.jdk/Contents/Home/jre/lib/ext/sunpkcs11.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_231.jdk/Contents/Home/jre/lib/ext/zipfs.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_231.jdk/Contents/Home/jre/lib/javaws.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_231.jdk/Contents/Home/jre/lib/jce.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_231.jdk/Contents/Home/jre/lib/jfr.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_231.jdk/Contents/Home/jre/lib/jfxswt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_231.jdk/Contents/Home/jre/lib/jsse.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_231.jdk/Contents/Home/jre/lib/management-agent.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_231.jdk/Contents/Home/jre/lib/plugin.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_231.jdk/Contents/Home/jre/lib/resources.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_231.jdk/Contents/Home/jre/lib/rt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_231.jdk/Contents/Home/lib/ant-javafx.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_231.jdk/Contents/Home/lib/dt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_231.jdk/Contents/Home/lib/javafx-mx.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_231.jdk/Contents/Home/lib/jconsole.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_231.jdk/Contents/Home/lib/packager.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_231.jdk/Contents/Home/lib/sa-jdi.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_231.jdk/Contents/Home/lib/tools.jar:/Users/mac/www/java/shujujiegou/out/production/shujujiegou jiegou.SparseArray
    原始的数组
    0	0	0	0	0	0	0	0	0	0	0	
    0	0	1	0	0	0	0	0	0	0	0	
    0	0	0	2	0	0	0	0	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	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	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	
    sum=3
    稀疏数组数组
    11	11	3	
    1	2	1	
    2	3	2	
    3	4	2	
    还原后的数组
    0	0	0	0	0	0	0	0	0	0	0	
    0	0	1	0	0	0	0	0	0	0	0	
    0	0	0	2	0	0	0	0	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	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	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	
    
    Process finished with exit code 0
    
    
    
  • 相关阅读:
    Remote desktop manager共享账号
    content is not supported outside 'script" or asp content' region
    How to pass values across the pages in ASP.net without using Session
    GitLab Flow
    C#如何获取系统downloads和documents路径
    sql server查询结果复制出来,没有换行(存进去的数据是换行的)
    Type Interceptors
    JsonNode、JsonObject常用方法
    java获取当前时间戳的方法
    Java中float/double取值范围与精度
  • 原文地址:https://www.cnblogs.com/brady-wang/p/15139611.html
Copyright © 2020-2023  润新知