1. 當(dāng)一個(gè)數(shù)組中大部分元素為 0,或者為同一個(gè)值時(shí),可以使用稀疏數(shù)組來(lái)保存該數(shù)組
處理方法:
記錄數(shù)組一共有多少行多少列,有多少種不同的值
把有不同值的元素的行列數(shù)及元素的值記錄在一個(gè)小的數(shù)組里,從而縮小程序的規(guī)模,這個(gè)小數(shù)組就是稀疏數(shù)組

這個(gè)原始的二維數(shù)組,一共有 6 * 7 = 42 個(gè)元素
用稀疏數(shù)組來(lái)記錄它

[0] 元素,記錄了一共有 6 行,7 列,8 個(gè)不同值(不是 0)的元素,之后的每一個(gè)元素,分別記錄每個(gè)不同值元素的行數(shù),列數(shù)和值
稀疏數(shù)組只需要存儲(chǔ) 3 * 9 = 27 個(gè)值
再來(lái)看一個(gè)例子:假如我們需要編寫一個(gè)五子棋,有這樣的棋盤

使用二維數(shù)組來(lái)記錄它,

用稀疏數(shù)組 a 來(lái)表示它 a[0] = {11, 11, 2} a[1] = {2, 1, 1} a[2] = {3, 2, 2}
2. 二維數(shù)組轉(zhuǎn)稀疏數(shù)組的思路:
(1)遍歷原始二維數(shù)組,得到有效數(shù)據(jù)的個(gè)數(shù) sum
(2)用 sum 來(lái)創(chuàng)建稀疏數(shù)組 sparseArray int[sum + 1][3]
(3)將二維數(shù)組的有效數(shù)據(jù)存入到稀疏數(shù)組中
3. 稀疏數(shù)組轉(zhuǎn)二維數(shù)組的思路:
(1)讀取稀疏數(shù)組的第一行, 讀取行數(shù)和列數(shù),創(chuàng)建原始數(shù)組
(2)讀取稀疏數(shù)組后面的數(shù)據(jù),賦值給原始數(shù)組
注意:二維數(shù)組的長(zhǎng)度:
(1)二維數(shù)組是規(guī)則的長(zhǎng)方形或正方形?
int[][] a = new int[11][11]; 它表示聲明了一個(gè)數(shù)組,里面有 11 個(gè)元素,每個(gè)元素是一個(gè)長(zhǎng)度為 11 的整數(shù)數(shù)組,長(zhǎng)度是 11, a.length =? 11
int[][] b = new int[2][12]; 它表示聲明了一個(gè)數(shù)組,里面有 2 個(gè)元素,每一個(gè)元素是一個(gè)長(zhǎng)度為 12 的整數(shù)數(shù)組,長(zhǎng)度是 12,a.length = 12
(2)二維數(shù)組是不規(guī)則的,每一行的元素個(gè)數(shù)不等
int [][] c = new int[3][];
c[0] = new int[] {1,2,3,4};
c[1] = new int[] {2,3,4,5,6,7,8};
c[2] = new int[] {0,0};
此時(shí),c.length = 3,遍歷時(shí)應(yīng)該分著使用 a[0].length,a[1].length,a[2].length
這說(shuō)明,如果行數(shù)和列數(shù)都已經(jīng)定義,二維數(shù)組的長(zhǎng)度為列數(shù),如果只有行數(shù)沒(méi)有列數(shù),二維數(shù)組的長(zhǎng)度為行數(shù)
具體代碼實(shí)現(xiàn):(舉例)
1. 假設(shè)有這樣一個(gè)數(shù)組可以用稀疏數(shù)組來(lái)簡(jiǎn)化表示它


2. 將其轉(zhuǎn)化為稀疏數(shù)組,首先遍歷二維數(shù)組,計(jì)算出有多少個(gè)元素是非 0 的

3. 創(chuàng)建稀疏數(shù)組并為其賦值

4. 將原數(shù)組轉(zhuǎn)化為稀疏數(shù)組


5. 可以用 IO流將其輸出到指定位置

6. 假如要將某個(gè)文件中存儲(chǔ)的稀疏數(shù)組轉(zhuǎn)化為原始數(shù)組


7. 將稀疏數(shù)組轉(zhuǎn)化為二維數(shù)組

注意:在實(shí)際工作中,通過(guò) IO流讀取稀疏數(shù)組文件,同時(shí)將其之間轉(zhuǎn)化為原數(shù)組更為方便,而這種先讀取為字符串再轉(zhuǎn)化為稀疏數(shù)組再轉(zhuǎn)化為原數(shù)組的方法是非常麻煩的
具體操作如下:
