引入
- 當在網頁上下棋類游戲時,玩到中途想要離開,但是我們需要保存進度,方便下次繼續
- 我們應該怎么實作 ?
- 以圍棋舉例
- 使用二維陣列將棋盤記下 ,如 0 為 沒有棋子 ,1 為 黑子 , 2為白子
- 但是沒有棋子的地方都為 0 ,整個二維陣列充斥著大量的無效資料 0
- 我們需要想一個辦法來 優化存盤的方式
基本介紹
- 當一個陣列中大部分元素是同一個值時,我們可以使用稀疏陣列來保存該陣列
- 稀疏陣列:是將一個有效元素 的 坐標 和 值 記錄在一個小規模陣列中
- 該有效陣列的頭部(第一行)
- 記錄了原陣列一個 有幾行,幾列,有多少個有效值
- 該陣列剩下的行數
- 是由有效值的個數來決定的 ,即 一個有效數占據一行

代碼實作
SparseArray.java
- main方法
public static void main(String[] args) {
// 定義一個全是0的陣列
int[][] array = new int[11][11];
// 向陣列中添加幾個 有效元素
array[2][3] = 1;
array[3][4] = 2;
array[2][5] = 2;
array[5][5] = 2;
// 遍歷該陣列查看效果
for (int[] row : array) {
for (int data : row) {
System.out.print(data + " ");
}
System.out.println();
}
int[][] sparse = toSparseArray(array);
int[][] toArray = toArray(sparse);
}

- 陣列轉稀疏陣列
public static int[][] toSparseArray(int[][] array) {
/*
* 思路:
* 1.根據傳入的二維陣列,創建稀疏陣列
* 2.遍歷二維陣列 ,如果當前元素值為有效值(不為0) ,就將該元素的坐標和值保存到稀疏陣列中
* 3.因為需要坐標,所以使用普通for回圈
*/
// 1. 根據傳入的二維陣列創建稀疏陣列 ,并給稀疏陣列第一行賦值
// 1.1 遍歷二維陣列,獲取有效元素個數
int num = 0;
for (int i = 0; i < array.length; i++) {
int[] row = array[i];
for (int j = 0; j < row.length; j++) {
if (row[j] != 0) {
num++;
}
}
}
// 1.2 創建稀疏陣列
int[][] sparse = new int[num + 1][3];
// 1.3 給稀疏陣列第一行賦值
sparse[0][0] = array.length; // 原陣列行數
sparse[0][1] = array[0].length; // 原陣列列數
sparse[0][2] = num; // 有效元素個數值
// 2.1 定義一個值 ,記錄稀疏陣列實際的行數
num = 0;
// 2.2 再次遍歷二維陣列 ,并給稀疏陣列賦值
for (int i = 0; i < array.length; i++) {
int[] row = array[i];
for (int j = 0; j < row.length; j++) {
if (row[j] != 0) {
++num;
sparse[num][0] = i;
sparse[num][1] = j;
sparse[num][2] = array[i][j];
}
}
}
// 遍歷該陣列查看效果
for (int[] row : sparse) {
for (int data : row) {
System.out.print(data + " ");
}
System.out.println();
}
return sparse;
}

- 稀疏陣列轉陣列
private static int[][] toArray(int[][] sparse) {
// 根據稀疏陣列的第一行,創建二維陣列
int[][] array = new int[sparse[0][0]][sparse[0][1]];
// 遍歷稀疏陣列 ,從第二行開始將稀疏陣列中的值 賦給 創建好的二維陣列
for (int i = 1; i < sparse.length; i++) {
int[] row = sparse[i];
array[row[0]][row[1]]=row[2];
}
// 遍歷二維陣列,列印值
for (int[] row : array) {
for (int data : row) {
System.out.print(data + " ");
}
System.out.println();
}
return array;
}

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/551072.html
標籤:其他
下一篇:返回列表
