首先我們看一個需求
在11 * 11 的五子棋的棋盤中 我們使用0
代表十字交叉點也是無效的數據 用1
代表黑棋 用2
代表藍棋
那麼所看到的棋盤如下
改用數字顯示後就如一下樣式
現在我們需要將怎個棋盤存儲起來,但是又發現有很多爲0 的無效數據,那麼我們就需要考慮將有效的數據存儲無效的數據不用存儲起來
這樣我們就可以使用稀疏數組將數據存儲起來
稀疏數組
稀疏數組有一定會有三行,列是隨有效數據的個數而變化的,先看一個稀疏數組的大概樣子
二維數組轉換爲稀疏數組的思路
- 第一部 需要遍歷稀疏數組,獲取有效數據的個數(
sum
),改個數可以用來確定稀疏數組的行數,那麼稀疏數組的行數就是(sum + 1
)【因爲稀疏數組的第一行是原始二維數組已經確定好了的】
//統計原始二維數組中的有效數據的個數,sum代表二維數組中有效數據的個數
int sum = 0;
for (int i = 0; i < chessArr.length; i++) {
for (int j = 0; j < chessArr.length; j++) {
if (chessArr[i][j] != 0){
sum++;
}
}
}
System.out.println("有效數據的個數爲:" + sum);
- 第二部 創建一個稀疏數組
int[][] sparseArr[sum +1 ][3]
//1. 創建稀疏數組
int sparseArr[][] = new int[sum + 1][3];
- 第三部 遍歷稀疏數組中的有效數據的索引和值,並將有效數據存入稀疏數組中
//給稀疏數組的第一行復制
sparseArr[0][0] = 11;
sparseArr[0][1] = 11;
sparseArr[0][2] = sum; --sum(有效數據的個數)
//2. 給稀疏數組賦值,count用於計數,計算該稀疏數組的第幾行
int count = 0;
for (int i = 0; i < chessArr.length; i++) {
for (int j = 0; j < chessArr.length; j++) {
if (chessArr[i][j] != 0){
count++;
sparseArr[count][0] = i;
sparseArr[count][1] = j;
sparseArr[count][2] = chessArr[i][j];
}
}
}
稀疏數組轉換爲二維數組的思路
- 第一部 讀取稀疏數組的第一行,利用第一行的數據,創建出沒有有效數據的二維數組
reChessArr = int[sparseArr[0][0]][sparseArr[0][1]]
;
int reChessArr[][] = new int[sparseArr[0][0]][sparseArr[0][1]];
- 第二部 遍歷稀疏數組的後幾行數據,並且賦值給
reChessArr
, 這樣就還原了有數據的二維數組
//給還原後的二維數組賦值
for (int i = 1; i < sparseArr.length; i++) {
reChessArr[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
}