Java二維數(shù)組與稀疏數(shù)組相互轉(zhuǎn)換實現(xiàn)詳解
一、稀疏數(shù)組
1、什么是稀疏數(shù)組
當(dāng)一個數(shù)組中大部分元素為0,或者為同一個值的數(shù)組時,可以用稀疏數(shù)組來保存該數(shù)組。稀疏數(shù)組,記錄一共有幾行幾列,有多少個不為零的值或相同的值。
簡單來說就是將大規(guī)模的數(shù)組縮小成小規(guī)模的數(shù)據(jù),從而減少空間浪費。
2、圖示
上面的圖示中,左側(cè)是二維數(shù)組,右側(cè)是稀疏數(shù)組,將二維數(shù)組轉(zhuǎn)成稀疏數(shù)組,明顯的可以看出空間減少了,可以有效的節(jié)約空間,提高效率。那么二維數(shù)組怎么生成稀疏數(shù)組呢?其實很簡單,因為二維數(shù)組有特定的格式,按格式將二維數(shù)組中的數(shù)據(jù)放入稀疏數(shù)組即可。
3、稀疏數(shù)組的表達(dá)方式
稀疏數(shù)組的列是固定的,只有三列,第一列表示二維數(shù)組的行,第二列表示二維數(shù)組的列,第三列表示二維數(shù)組非零數(shù)的個數(shù)。稀疏數(shù)組的第一行是固定的,用來表示總行數(shù),總列數(shù),總個數(shù)。其余行數(shù)根據(jù)個數(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)遍歷得到非零個數(shù) int num = 0; for(int[] row : ChessArr1) { for(int data : row) { if(data != 0) { num++; } } }
上面用到了增強(qiáng)for循環(huán),第一個增強(qiáng)for循環(huán)表示每一個row代表一行(二維數(shù)組的行)也就相當(dāng)與一維數(shù)組,第二個增強(qiáng)for循環(huán)再遍歷一維數(shù)組得到每一個數(shù)據(jù)data來進(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ù)組的大小是知道的,所以行列的總數(shù)可以直接賦值,總有效個數(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ù)組,判斷條件是這個數(shù)不等于零,此處需要一個計數(shù)變量,每符合一個非零數(shù),計數(shù)變量就加一,可以用來表示稀疏數(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ù)的個數(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、定義一個新的二維數(shù)組 int[][] ChessArr2 = new int[SparseArr[0][0]][SparseArr[0][1]];
二維數(shù)組的大小來自稀疏數(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]; }
因為除了少數(shù)是有效個數(shù),其他全是零,所以我們只需要遍歷有效個數(shù)。i 表示第幾個有效個數(shù)也表示當(dāng)前這個數(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、定義一個新的二維數(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)換實現(xiàn)詳解的文章就介紹到這了,更多相關(guān)Java二維數(shù)組與稀疏數(shù)組轉(zhuǎn)換內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java數(shù)據(jù)結(jié)構(gòu)之稀疏數(shù)組的實現(xiàn)與應(yīng)用
- java稀疏數(shù)組的示例代碼
- java數(shù)據(jù)結(jié)構(gòu)算法稀疏數(shù)組示例詳解
- Java 輕松實現(xiàn)二維數(shù)組與稀疏數(shù)組互轉(zhuǎn)
- Java數(shù)據(jù)結(jié)構(gòu)實現(xiàn)二維數(shù)組與稀疏數(shù)組轉(zhuǎn)換詳解
- java數(shù)據(jù)結(jié)構(gòu)基礎(chǔ):稀疏數(shù)組
- Java實現(xiàn)二維數(shù)組和稀疏數(shù)組之間的轉(zhuǎn)換
- 淺談Java數(shù)據(jù)結(jié)構(gòu)之稀疏數(shù)組知識總結(jié)
- Java稀疏數(shù)組的應(yīng)用實踐
相關(guān)文章
SpringBoot+VUE實現(xiàn)數(shù)據(jù)表格的實戰(zhàn)
本文將使用VUE+SpringBoot+MybatisPlus,以前后端分離的形式來實現(xiàn)數(shù)據(jù)表格在前端的渲染,具有一定的參考價值,感興趣的可以了解一下2021-08-08Java HashMap三種循環(huán)遍歷方式及其性能對比實例分析
這篇文章主要介紹了Java HashMap三種循環(huán)遍歷方式及其性能對比,結(jié)合具體實例形式分析了Java HashMap三種循環(huán)遍歷方式的實現(xiàn)方法、運行效率及性能優(yōu)劣,需要的朋友可以參考下2019-10-10MyBatis?@Select注解介紹:基本用法與動態(tài)SQL拼寫方式
這篇文章主要介紹了MyBatis?@Select注解介紹:基本用法與動態(tài)SQL拼寫方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-07-07spring/springboot整合curator遇到的坑及解決
這篇文章主要介紹了spring/springboot整合curator遇到的坑及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-05-05