1. 程式人生 > >其它 >【Java資料結構與演算法】二維陣列與稀疏陣列

【Java資料結構與演算法】二維陣列與稀疏陣列


二維陣列與稀疏陣列的互換:

【Java資料結構與演算法】二維陣列與稀疏陣列

圖片來源於 尚矽谷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)
  • 根據稀疏陣列後續行
    • 賦值到 二維陣列對應位置