最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java二維數(shù)組與稀疏數(shù)組相互轉(zhuǎn)換實(shí)現(xiàn)詳解

 更新時(shí)間:2022年09月26日 08:37:31   作者:小黎的培培筆錄  
在某些應(yīng)用場(chǎng)景中需要大量的二維數(shù)組來(lái)進(jìn)行數(shù)據(jù)存儲(chǔ),但是二維數(shù)組中卻有著大量的無(wú)用的位置占據(jù)著內(nèi)存空間,稀疏數(shù)組就是為了優(yōu)化二維數(shù)組,節(jié)省內(nèi)存空間

一、稀疏數(shù)組

1、什么是稀疏數(shù)組

當(dāng)一個(gè)數(shù)組中大部分元素為0,或者為同一個(gè)值的數(shù)組時(shí),可以用稀疏數(shù)組來(lái)保存該數(shù)組。稀疏數(shù)組,記錄一共有幾行幾列,有多少個(gè)不為零的值或相同的值。

簡(jiǎn)單來(lái)說(shuō)就是將大規(guī)模的數(shù)組縮小成小規(guī)模的數(shù)據(jù),從而減少空間浪費(fèi)。

2、圖示

上面的圖示中,左側(cè)是二維數(shù)組,右側(cè)是稀疏數(shù)組,將二維數(shù)組轉(zhuǎn)成稀疏數(shù)組,明顯的可以看出空間減少了,可以有效的節(jié)約空間,提高效率。那么二維數(shù)組怎么生成稀疏數(shù)組呢?其實(shí)很簡(jiǎn)單,因?yàn)槎S數(shù)組有特定的格式,按格式將二維數(shù)組中的數(shù)據(jù)放入稀疏數(shù)組即可。

3、稀疏數(shù)組的表達(dá)方式

稀疏數(shù)組的列是固定的,只有三列,第一列表示二維數(shù)組的行,第二列表示二維數(shù)組的列,第三列表示二維數(shù)組非零數(shù)的個(gè)數(shù)。稀疏數(shù)組的第一行是固定的,用來(lái)表示總行數(shù),總列數(shù),總個(gè)數(shù)。其余行數(shù)根據(jù)個(gè)數(shù)而定。

二、二維數(shù)組→稀疏數(shù)組

根據(jù)上圖所示:

第一步:創(chuàng)建二維數(shù)組

//首先創(chuàng)建二維數(shù)組
int[][] ChessArr1 = new int[11][11];
//賦值
ChessArr1[1][2] = 1;
ChessArr1[2][3] = 2;
//循環(huán)遍歷得到非零個(gè)數(shù)
int num = 0;
for(int[] row : ChessArr1) {
   for(int data : row) {
       if(data != 0) {
           num++;
        }
   }
}

上面用到了增強(qiáng)for循環(huán),第一個(gè)增強(qiáng)for循環(huán)表示每一個(gè)row代表一行(二維數(shù)組的行)也就相當(dāng)與一維數(shù)組,第二個(gè)增強(qiáng)for循環(huán)再遍歷一維數(shù)組得到每一個(gè)數(shù)據(jù)data來(lái)進(jìn)行判斷是否是非零數(shù)。

第二步:創(chuàng)建稀疏數(shù)組,并賦值

int[][] SparseArr = new int[num + 1][3];
//第一行賦值
SparseArr[0][0] = 11;
SparseArr[0][1] = 11;
SparseArr[0][2] = num;

前面分析的時(shí)候說(shuō)了,第一行是固定的,二維數(shù)組的大小是知道的,所以行列的總數(shù)可以直接賦值,總有效個(gè)數(shù)也求了,也可以直接賦值。

第三步:遍歷二維數(shù)組并賦值給稀疏數(shù)組

        int count = 0;
        for(int i = 0; i < 11; i++) {
            for(int j = 0; j < 11; j++) {
                if(ChessArr1[i][j] != 0) {
                    count++;
                    SparseArr[count][0] = i;
                    SparseArr[count][1] = j;
                    SparseArr[count][2] = ChessArr1[i][j];
                }
            }
        }

遍歷二維數(shù)組,判斷條件是這個(gè)數(shù)不等于零,此處需要一個(gè)計(jì)數(shù)變量,每符合一個(gè)非零數(shù),計(jì)數(shù)變量就加一,可以用來(lái)表示稀疏數(shù)組的第幾行,稀疏數(shù)組的列數(shù)是固定的,所以找到后直接進(jìn)行賦值操作。

最后打印稀疏數(shù)組即可。

完整代碼

        //首先創(chuàng)建二維數(shù)組
        int[][] ChessArr1 = new int[11][11];
        //賦值
        ChessArr1[1][2] = 1;
        ChessArr1[2][3] = 2;
        //將原始數(shù)組轉(zhuǎn) 換成 稀疏數(shù)組
        //1、先遍歷原始數(shù)組得到非0數(shù)的個(gè)數(shù)
        int num = 0;
        for(int[] row : ChessArr1) {
            for(int data : row) {
                if(data != 0) {
                    num++;
                }
            }
        }
        //2、創(chuàng)建 稀疏數(shù)組
        int[][] SparseArr = new int[num + 1][3];
        //3、第一行賦值
        SparseArr[0][0] = 11;
        SparseArr[0][1] = 11;
        SparseArr[0][2] = num;
        //4、循環(huán)賦非0值
        int count = 0;
        for(int i = 0; i < 11; i++) {
            for(int j = 0; j < 11; j++) {
                if(ChessArr1[i][j] != 0) {
                    count++;
                    SparseArr[count][0] = i;
                    SparseArr[count][1] = j;
                    SparseArr[count][2] = ChessArr1[i][j];
                }
            }
        }
        //5、打印稀疏數(shù)組
        System.out.println("\n===打印稀疏數(shù)組===");
        for(int[] row : SparseArr) {
            for(int data : row) {
                System.out.printf("%d\t",data);
            }
            System.out.println();
        }

三、稀疏數(shù)組→二維數(shù)組

第一步:創(chuàng)建新的二維數(shù)組

//1、定義一個(gè)新的二維數(shù)組
int[][] ChessArr2 = new int[SparseArr[0][0]][SparseArr[0][1]];

二維數(shù)組的大小來(lái)自稀疏數(shù)組的第一行第一列和第一行第二列,也就是 SparseArr[0][0] 和 SparseArr[0][1] ;初始狀態(tài)下的二維數(shù)組數(shù)據(jù)全為零。

第二步:循環(huán)遍歷并賦值

        //2、賦值
        for(int i = 1; i <= SparseArr[0][2]; i++) {
            ChessArr2[SparseArr[i][0]][SparseArr[i][1]] = SparseArr[i][2];
        }

因?yàn)槌松贁?shù)是有效個(gè)數(shù),其他全是零,所以我們只需要遍歷有效個(gè)數(shù)。i 表示第幾個(gè)有效個(gè)數(shù)也表示當(dāng)前這個(gè)數(shù)在稀疏數(shù)組中的行,如上圖所示:如 i = 1,表示在稀疏數(shù)組的第一行,它在二維數(shù)組中的位置為 (1,2),數(shù)值為 1 ;所以行和列分別是SparseArr[1][0]和SparseArr[1][1],數(shù)值為SparseArr[1][2]。

所以賦值表達(dá)式為:ChessArr2[SparseArr[i][0]][SparseArr[i][1]] = SparseArr[i][2]。

完整代碼

        //將稀疏數(shù)組 轉(zhuǎn)換成 二維數(shù)組
        //1、定義一個(gè)新的二維數(shù)組
        int[][] ChessArr2 = new int[SparseArr[0][0]][SparseArr[0][1]];
        //2、賦值
        for(int i = 1; i <= SparseArr[0][2]; i++) {
            ChessArr2[SparseArr[i][0]][SparseArr[i][1]] = SparseArr[i][2];
        }
        //3、打印新的二維數(shù)組
        System.out.println("\n===新的二維數(shù)組===");
        for(int[] row : ChessArr2) {
            for(int data : row) {
                System.out.printf("%d\t",data);
            }
            System.out.println();
        }

到此這篇關(guān)于Java二維數(shù)組與稀疏數(shù)組相互轉(zhuǎn)換實(shí)現(xiàn)詳解的文章就介紹到這了,更多相關(guān)Java二維數(shù)組與稀疏數(shù)組轉(zhuǎn)換內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Idea打不了斷點(diǎn)如何解決

    Idea打不了斷點(diǎn)如何解決

    這篇文章主要介紹了Idea打不了斷點(diǎn)如何解決的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • JAVA設(shè)計(jì)模式---原型模式你了解嗎

    JAVA設(shè)計(jì)模式---原型模式你了解嗎

    這篇文章主要介紹了JAVA 原型模式的的相關(guān)資料,文中講解非常細(xì)致,實(shí)例幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2021-09-09
  • java實(shí)現(xiàn)快速打字游戲

    java實(shí)現(xiàn)快速打字游戲

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)快速打字游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • springboot的緩存技術(shù)的實(shí)現(xiàn)

    springboot的緩存技術(shù)的實(shí)現(xiàn)

    這篇文章主要介紹了springboot的緩存技術(shù)的實(shí)現(xiàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • 小議Java中@param注解與@see注解的作用

    小議Java中@param注解與@see注解的作用

    這篇文章主要介紹了Java中@param注解與@see注解的作用,注解的功能類(lèi)似于通常代碼中的注釋,需要的朋友可以參考下
    2015-12-12
  • 利用Java計(jì)算某個(gè)日期是星期幾

    利用Java計(jì)算某個(gè)日期是星期幾

    不知道大家有沒(méi)有遇到過(guò)同樣的問(wèn)題,誰(shuí)誰(shuí)的生日又要到了,看看是星期幾?每年都要遇到好幾次,所以想索性利用Java寫(xiě)個(gè)小工具,一次查詢(xún)某具體日期在n年中分別是星期幾。這樣不就方便了嗎?本文里給出了詳細(xì)的示例代碼,感興趣的朋友們下面來(lái)一起看看吧。
    2016-10-10
  • 淺談JSONObject的使用及示例代碼(JSON解析)

    淺談JSONObject的使用及示例代碼(JSON解析)

    這篇文章主要介紹了淺談JSONObject的使用及示例代碼(JSON解析),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • 深入了解java Lombok的使用方法

    深入了解java Lombok的使用方法

    這篇文章主要介紹了深入了解java Lombok的使用,Lombok是一個(gè)通過(guò)注解以達(dá)到減少代碼的Java庫(kù),如通過(guò)注解的方式減少get,set方法,構(gòu)造方法等,需要的朋友可以參考下
    2019-06-06
  • 舉例講解Java中的多線程編程

    舉例講解Java中的多線程編程

    這篇文章主要介紹了舉例講解Java中的多線程編程,線程是Java學(xué)習(xí)中的重要知識(shí),需要的朋友可以參考下
    2015-09-09
  • 詳細(xì)解讀spring中的@Resource注解

    詳細(xì)解讀spring中的@Resource注解

    這篇文章主要介紹了詳細(xì)解讀spring中的@Resource注解,此注解來(lái)源于JSR規(guī)范(Java?Specification?Requests),其作用是找到依賴(lài)的組件注入到應(yīng)用來(lái),它利用了JNDI技術(shù)查找所需的資源,需要的朋友可以參考下
    2023-10-10

最新評(píng)論

寿阳县| 青川县| 揭阳市| 龙山县| 大方县| 子长县| 凤山市| 彭山县| 微山县| 屏南县| 平定县| 南部县| 加查县| 闽侯县| 宜昌市| 天祝| 苏尼特左旗| 壤塘县| 阳信县| 周口市| 恭城| 乐山市| 平邑县| 荆州市| 梁山县| 温泉县| 娱乐| 墨脱县| 普陀区| 隆化县| 堆龙德庆县| 九江县| 涞源县| 吐鲁番市| 中山市| 大方县| 巍山| 新乡市| 扶绥县| 崇左市| 庆云县|