我們先看一個實際的需求:
編寫一個五子棋盤程序,並存在退出後存盤功能和續上盤的功能。
解決方案
- 方案一:將這個棋盤模擬成一個二維數組,將數據存儲起來。
- 方案二:使用稀疏數組,將棋盤存儲起來,並達到一個數據壓縮的效果。
解決方案優劣勢分析
- 方案一:
- 優勢: 簡單方便,代碼簡單。
- 劣勢: 造成數據冗餘,有很多不必要的數據存儲下來了。
- 方案二:
- 優勢:節省儲存空間
- 劣勢:代碼稍微複雜一些
稀疏數組簡介
代碼實現
public class SparseArray {
public static void main(String[] args) {
// 首先我們創建一個存儲有數據的二維數組,6行7列
int[][] array = new int[6][7];
// 給數組裏面添加數據
int[0][2] = 22;
int[0][6] = 15;
int[1][1] = 11;
int[1][5] = 17;
int[2][3] = -6;
int[3][5] = 39;
int[4][0] = 91;
int[5][2] = 28;
}
/**
* 傳入一個非空大小的二維數組,轉成一個二維的稀疏數組
*
* @param 二維數組
*/
public int[][] arrayToSparse(int[][] array) {
// 1. 遍歷數組計算出該數組的有效數據的個數
int sum = 0;
for (int i = 0;i < array.length();i++) {
for (int j = 0;i< array[0].length();j++) {
if (array[i][j] != 0) {
sum += 1;
}
}
}
// 2. 創建一個稀疏數組
int[][] sparse = int[sum+1][3];
// 給第一行填充數據
sparse[0][0] = array.length();
sparse[0][1] = array[0].length();
sparse[0][2] = sum;
// 3. 遍歷數組給稀疏數組填充數據
int row = 1;
for (int i = 0;i < array.length();i++) {
for (int j = 0;i< array[0].length();j++) {
if (array[i][j] != 0) {
// 記錄數據行數
sparse[row][0] = i;
// 記錄數據列數
sparse[row][1] = j;
// 記錄數據
sparse[row][2] = array[i][j];
row += 1;
}
}
}
// 4. 返回稀疏數組
return sparse;
}
/**
* 將稀疏數組覆盤成爲普通的數組
*
* @param sparse 稀疏數組
*/
public int[][] sparseToArray(int[][] sparse) {
// 1. 創建一個普通的數組
int[][] array = new int[sparse[0][0]][sparse[0][1]];
// 2. 遍歷稀疏數組
for (int i = 1;i < sparse.length();i++) {
array[sparse[i][0]][sparse[i][1]] = sparse[i][3];
}
}
}
代碼寫完了,這種方式儲存數據可以達到壓縮的效果,有人說你的步驟這麼麻煩,還不如直接存起來就行了,其實這是一個用時間換空間的算法。