【Java資料結構與演算法】二維陣列與稀疏陣列
阿新 • • 發佈:2021-03-09
二維陣列與稀疏陣列的互換:
圖片來源於 尚矽谷Java資料結構與java演算法
/*
五子棋棋盤 大小:11*11
0:沒有棋子 1:黑子 2:白子
*/
public class SparseArray {
public static void main(String[] args) {
// 建立 二維陣列 11* 11
int[][] array = new int[11][11];
// 給對應位置賦值
array[1][2] = 1;
array[2][3] = 2;
// array[3][4] = 2; //測試加一個數據
// 輸出原始二維陣列
System.out.println("=====二維陣列=======");
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[0].length; j++) {
System.out.printf("%d\t", array[i][j]);
}
System.out.println ();
}
// 1. 二維陣列 -> 稀疏陣列
/*
格式:(序號) row col val
大小: sum(非0資料) * 3
步驟:
①.求出sum (遍歷得出非0資料個數)
②.獲取非0資料 得到 row(i) col(j) val(value) (遍歷獲取)
*/
// ①.求出sum (遍歷得出非0資料個數)
int sum = 0;
for (int i = 0; i < 11; i++) {
for (int j = 0; j < 11; j++) {
if (array[i][j] == 0) {
} else
sum++;
}
}
System.out.println("============");
System.out.println("非0資料個數:" + sum);
// 建立 稀疏陣列
int[][] sparseArray = new int[sum + 1][3];
// System.out.println(array.length); // 二維陣列的行
// System.out.println(array[0].length); // 二維陣列的列
// 根據二維陣列大小以及sum 來 對稀疏陣列第0行進行賦值
sparseArray[0][0] = 11; // "二維陣列總row:array.length = 11";
sparseArray[0][1] = 11; // "二維陣列總col:array[0].length = 11";
sparseArray[0][2] = sum; // 非0資料個數
// 將對應值賦值到稀疏陣列中
int counter = 1; // 從第1行開始賦值
for (int i = 0; i < 11; i++) {
for (int j = 0; j < 11; j++) {
if (array[i][j] == 0) {
} else {
sparseArray[counter][0] = i; // "當前資料在二維陣列中的行數" 就是 i;
sparseArray[counter][1] = j; // "當前資料在二維陣列中的列數" 就是 j;
sparseArray[counter][2] = array[i][j];
counter++;
}
}
}
// 輸出稀疏陣列
System.out.println("=====稀疏陣列=======");
for (int i = 0; i < sparseArray.length; i++) {
for (int j = 0; j < sparseArray[0].length; j++) {
System.out.printf("%d\t", sparseArray[i][j]);
}
System.out.println();
}
// 2. 稀疏陣列 -> 二維陣列
// 建立一個二維陣列
int[][] array2 = new int [sparseArray[0][0]][sparseArray[0][1]];
// 將稀疏陣列中的資料賦值至二維陣列中的對應位置
for (int i = 1; i < sparseArray.length; i++) {
array2[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2];
}
// 輸出二維陣列
System.out.println("=====二維陣列=======");
for (int i = 0; i < array2.length; i++) {
for (int j = 0; j < array2[0].length; j++) {
System.out.printf("%d\t", array2[i][j]);
}
System.out.println();
}
}
}
java獲取二維陣列的 行數 和 列數
int[][] array = new int[3][4];
System.out.println("二維陣列的行數:"+array.length);
System.out.println("二維陣列的列數:"+array[0].length);
思路整理:
二維陣列 -> 稀疏陣列(?* 3)
-
求得二維陣列的 行數 和 列數 (array.length array[0].length )
- 確定了稀疏陣列第一行的 row col
-
求得二維陣列的 非0資料個數sum (遍歷陣列)
- 確定了稀疏陣列第一行的 val = sum
- 確定了稀疏陣列的 行數 = sum + 1
-
求得二維陣列非0資料 對應的 row 和 col 以及 value (行:i ,列:j )
- 賦值給稀疏陣列
稀疏陣列 -> 二維陣列
- 根據稀疏陣列第一行
- 得到 二維陣列的大小(row*col)
- 根據稀疏陣列後續行
- 賦值到 二維陣列對應位置