二維數(shù)組與稀疏數(shù)組的互相轉(zhuǎn)換

二維數(shù)組的定義:本質(zhì)上是以數(shù)組為數(shù)組元素的數(shù)組,即 數(shù)組的數(shù)組

稀疏數(shù)組的誕生的大概背景:在傳統(tǒng)的二維數(shù)組存儲方式,會利用大量的存儲空間來存放0值(即默認值為0),從而浪費大量內(nèi)存,進行存儲時會浪費比較大的空間。

稀疏數(shù)組的定義:通過一個三元組的方式將非0數(shù)據(jù)保存到一個數(shù)組中。

代碼實現(xiàn)(Java代碼)

        // 創(chuàng)建一個二維數(shù)組 6 * 6
        // 在二維數(shù)組中存放三個數(shù)據(jù)
        int[][] array = new int[6][6];
        // 第2行第6列存放一個為66的數(shù)據(jù)
        array[1][5] = 66;
        // 第3行第3列存放一個為 99
        array[2][2] = 99;
        // 第6行第3列存放一個為88的數(shù)據(jù)
        array[5][2] = 88;

輸出 二維數(shù)組的數(shù)據(jù)

        for (int[] row : array) {
            for (int data : row) {
                System.out.print(data + "\t");
            }
            System.out.println();
        }

二維數(shù)組 轉(zhuǎn) 稀疏數(shù)組
創(chuàng)建一個稀疏數(shù)組需要的條件
1)遍歷二維數(shù)組,獲取到 有效數(shù)據(jù)的個數(shù)(sum)
2)根據(jù)sum創(chuàng)建 稀疏數(shù)組 sparse int[ sum + 1 ][ 3 ]

        // 獲取有效數(shù)據(jù)的個數(shù)
        int sum = 0;
        for (int[] row : array) {
            for (int data : row) {
                if( data != 0 ){
                    sum ++;
                }
            }
        }
        System.out.println("二維數(shù)組中有效的數(shù)據(jù)個數(shù)為:" + sum); 
       // 結(jié)果為:sum = 3

創(chuàng)建 稀疏數(shù)組

       // 根據(jù)sum創(chuàng)建 稀疏數(shù)組
        int [][] sparse = new int[sum + 1][3];

稀疏數(shù)組的第一行存儲二維數(shù)組的 行 與 列有效數(shù)據(jù)的個數(shù)

        // 第一行存放 二維數(shù)組的行與列和有效數(shù)據(jù)的個數(shù)
        sparse[0][0] = array.length; sparse[0][1] = array[0].length; sparse[0][2] = sum;

稀疏數(shù)組的第N行(N != 0 && N > 0 )存儲 有效數(shù)據(jù) 在二維數(shù)組中的位置

        // 用于記錄
        int count = 0;
        // row
        for (int i = 0; i < array.length; i++) {
            // data
            for (int j = 0; j < array[i].length; j++) {
                if( array[i][j] != 0 ){
                    count ++;
                    sparse[count][0] = i;
                    sparse[count][1] = j;
                    sparse[count][2] = array[i][j];
                }
            }
        }

輸出 稀疏數(shù)組的數(shù)據(jù)


二維數(shù)組數(shù)據(jù) 與 稀疏數(shù)組數(shù)據(jù)進行校驗


image.png

稀疏數(shù)組 轉(zhuǎn) 二維數(shù)組

// 根據(jù) 稀疏數(shù)組的第一行 存儲二維數(shù)組的行數(shù)與列數(shù)來創(chuàng)建一個新的二維數(shù)組
int [][] array2 = new int[sparse[0][0]][sparse[0][1]];

將稀疏數(shù)組的第N行(N != 0 && N > 0 )存儲的有效數(shù)據(jù) 賦值給 array2 二維數(shù)組

        // row
        for (int i = 1; i < sparse.length; i++) {
            // data
            for (int j = 0; j < sparse[i].length; j++) {
                array2[sparse[i][0]][sparse[i][1]] = sparse[i][j];
            }
        }

輸出 二維數(shù)組 array2 的數(shù)據(jù)

        for (int[] row : array2) {
            for (int data : row) {
                System.out.print(data + "\t");
            }
            System.out.println();
        }

本次案例的完整案例代碼如下:

  // 創(chuàng)建一個二維數(shù)組 6 * 6
        // 在二維數(shù)組中存放兩個數(shù)據(jù)
        int[][] array = new int[6][6];
        // 第2行第6列存放一個為66的數(shù)據(jù)
        array[1][5] = 66;
        // 第3行第3列存放一個為 99
        array[2][2] = 99;
        // 第6行第3列存放一個為88的數(shù)據(jù)
        array[5][2] = 88;
        //輸出
        // 記錄二維數(shù)組中有幾個有效的數(shù)值
        int sum = 0;
        for (int[] row : array) {
            for (int data : row) {
                System.out.print(data + "\t");
                if( data != 0 ){
                    sum ++;
                }
            }
            System.out.println();
        }
        System.out.println();
        System.out.println("二維數(shù)組中有效的數(shù)據(jù)個數(shù)為:" + sum);

        // 創(chuàng)建一個 稀疏數(shù)組 的前提條件(需要知道二維數(shù)組中有效的數(shù)據(jù)個數(shù))
        // 1、遍歷二維數(shù)組,獲取到有效數(shù)據(jù)的個數(shù)(sum)
        // 2、根據(jù)sum創(chuàng)建 稀疏數(shù)組
        int [][] sparse = new int[sum + 1][3];
        // 第一行存放 二維數(shù)組的行與列和有效數(shù)據(jù)的個數(shù)
        sparse[0][0] = array.length;sparse[0][1] = array[0].length;sparse[0][2] = sum;
        // 用于記錄
        int count = 0;
        // row
        for (int i = 0; i < array.length; i++) {
            // data
            for (int j = 0; j < array[i].length; j++) {
                if( array[i][j] != 0 ){
                    count ++;
                    sparse[count][0] = i;
                    sparse[count][1] = j;
                    sparse[count][2] = array[i][j];
                }
            }
        }
        // 輸出 稀疏數(shù)組
        for (int[] ros : sparse) {
            for (int data : ros) {
                System.out.print(data + "\t");
            }
            System.out.println();
        }

        System.out.println();
        System.out.println();

        // 稀疏數(shù)組轉(zhuǎn)二維數(shù)組
        int [][] array2 = new int[sparse[0][0]][sparse[0][1]];
        // row
        for (int i = 1; i < sparse.length; i++) {
            // data
            for (int j = 0; j < sparse[i].length; j++) {
                array2[sparse[i][0]][sparse[i][1]] = sparse[i][j];
            }
        }
        // 輸出二維數(shù)組
        for (int[] row : array2) {
            for (int data : row) {
                System.out.print(data + "\t");
            }
            System.out.println();
        }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容