1. 程式人生 > 其它 >二維陣列與稀疏陣列相互之間的轉化

二維陣列與稀疏陣列相互之間的轉化

二維陣列與稀疏陣列之間的轉化

什麼是稀疏陣列,可以用一張圖表示

0 1 2
0 原始 二維陣列行數 原始二維陣列列數 原始二維陣列中值的個數
1 原始行 原始列 原始值

下面舉一個例子

>將下面二維陣列轉化壓縮為稀疏陣列:

0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0
0 0 0 2 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0

>轉換後的稀疏陣列為:

11 11 2
1 2 1
2 3 2

具體程式碼如下

·public class Demo01 {

/*使用稀疏陣列來儲存二維陣列中的資料
* 稀疏陣列第一行記錄的是二維陣列的行數列數和值的個數
* 接下來記錄的是原始陣列中值所在的位置*/

//整體思路
//1,先建立一個二維陣列
//2,遍歷原始陣列,得到不為0的值的個數
//3,壓縮,建立稀疏陣列,遍歷稀疏陣列,將原始陣列中的資料儲存到稀疏陣列中去
//4,解壓,將稀疏陣列轉化為原始陣列
public static void main(String[] args) {
    //建立一個原始的二維陣列
    //0表示沒有棋子,1表示黑子,2表示白子
    int[][] arr = new int[11][11];
    arr[1][2] = 1;
    arr[2][3] = 2;

    //輸出原始二維陣列
    System.out.println("原始陣列為:");
    for (int row[] : arr) {
        for (int data : row) {
            System.out.printf("%d\t", data);
        }
        System.out.println();
    }

    //將二維陣列轉化成為稀疏陣列
    //遍歷得到0的個數
    int sum = 0;
    for (int i = 0; i < 11; i++) {
        for (int j = 0; j < 11; j++) {
            if (arr[i][j] != 0) {
                sum++;
            }
        }
    }

    //建立對應的稀疏陣列
    int sparseArr[][] = new int[sum+1][3];

    //為稀疏陣列賦值
    sparseArr[0][0] = 11;
    sparseArr[0][1] = 11;
    sparseArr[0][2] = sum;

    //遍歷二維陣列,存入到稀疏陣列中
    int count = 0;
    for (int i = 0; i < 11; i++) {
        for (int j = 0; j < 11; j++) {
            if (arr[i][j] != 0) {
                count++;
               sparseArr[count][0] =i;
               sparseArr[count][1] =j;
               sparseArr[count][2] =arr[i][j];
            }
        }
    }
    //遍歷稀疏陣列
    System.out.println("稀疏陣列為:");
    for (int i = 0; i < sparseArr.length; i++) {
        System.out.printf("%d\t%d\t%d\t\n",sparseArr[i][0],sparseArr[i][1],sparseArr[i][2]);
    }
    //將稀疏陣列恢復為原始二維陣列
    int yuanArr[][] = new int[sparseArr[0][1]][sparseArr[0][1]];
    for (int i = 0; i < sparseArr.length-1; i++) {
        yuanArr[sparseArr[i+1][0]][sparseArr[i+1][1]] = sparseArr[i+1][2];
    }
    System.out.println("恢復後的原屬陣列為:");
   for (int row[]:yuanArr){
       for (int data: row){
           System.out.printf("%d\t",data);
       }
       System.out.println();
   }
}

}

·