Java实现二维数组和稀疏数组的转换
生活随笔
收集整理的這篇文章主要介紹了
Java实现二维数组和稀疏数组的转换
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 稀疏數組
- 二維數組——>稀疏數組
- 稀疏數組——>二維數組
- 完整code
稀疏數組
簡介:當編寫的二維數組中存在很多不用的點但初始化時都賦值為0時,這個二維數組的觀賞性很低并且非常浪費存儲空間,這個時候會選擇使用稀疏數組對這個二維數組進行簡化壓縮。
稀疏數組是當一個二維數組大部分數據為0或其他相同數據時,對這個數組的一種簡化的保存形式。
處理規則:
①記錄二維數組有幾行幾列,并把不同值的元素保存下來。
②記錄不同值元素的坐標,并把它保存在一個小數組中,從而縮小程序規模。
用一個簡單模型進行直觀分析:
下圖是一個11×11的二維數組,其中有兩個非0元素(上述①的不同值的元素)
轉化為稀疏數組:
- 第一行記錄數組的總行列數以及有值元素的個數;
- 之后的每行都會記錄各個非零元素的“坐標”以及數值);
- 稀疏數組固定為“行”、“列”、“值”3列,行數由不同值的元素個數決定。
二維數組——>稀疏數組
將原始二維數組中的有效數據存入新建數組中。
在實際應用當中,填充完畢的稀疏數組需要存盤到一個文件中,也就是把計算機中的信息存儲到磁盤上,多用于游戲存檔讀檔(比如說圍棋游戲就很適合),并且可以恢復成原始的二維數組
操作流程:
- 第一步:創建并輸出原始二維數組
運行結果圖:
- 第二步:計算有效數據的個數
運行結果圖:
- 第三步:填充稀疏數組并將其打印出來
運行結果圖:
稀疏數組——>二維數組
再讀取剩下幾行的數據即可
在實際應用當中,先將文件恢復成稀疏數組,再轉換成原始二維數組
操作流程:
-
第一步:讀取稀疏數組的值恢復原始的二維數組
-
第二步:讀取稀疏數組后幾行數據,將有效值填充到二維數組的指定位置
運行結果圖:
在上面的基礎上,將稀疏數組保存到磁盤“map.data”上,恢復原來的數組時,讀取“map.data”進行恢復。
完整code
import java.awt.Desktop; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStreamReader; import java.io.OutputStreamWriter;public class SparseArray {public static void main(String[] args) throws Exception {// 在方法聲明部分使用,表示該方法可能產生此異常,如果在方法聲明處使用了throws// 聲明異常,則該方法產生異常也不必捕獲,會直接把異常拋出到調用該方法的地方。// 創建一個原始的二維數組11*11int chessArr1[][] = new int[11][11];chessArr1[2][2] = 3;chessArr1[6][4] = 8;// 輸出原始的二維數組System.out.println("原始二維數組:");for (int[] row : chessArr1) { // 遍歷棋盤二維數組中的每一個一維數組for (int data : row) { // 遍歷一維數組中的每一個元素System.out.printf("%d\t", data);}System.out.println();}// 將二維數組轉換為稀疏數組的思路// 1.首先遍歷二維數組并計算有效數據的個數int sum = 0;// 計算有效數據的個數for (int i = 0; i < chessArr1.length; i++) {for (int j = 0; j < chessArr1.length; j++) {if (chessArr1[i][j] != 0) {sum++;}}}// 2.創建對應的稀疏數組 (int[ ][ ] sparseArr=new int [sum+1][3];)int[][] sparseArr = new int[sum + 1][3];sparseArr[0][0] = 11;sparseArr[0][1] = 11;sparseArr[0][2] = sum;// 遍歷二維數組,將非零的值存入sparseArr(稀疏數組)中int count = 0;// count用于記錄是第幾個有效元素for (int i = 0; i < chessArr1.length; i++) {// 遍歷每一行for (int j = 0; j < chessArr1.length; j++) {// 遍歷每一列if (chessArr1[i][j] != 0) {// 如果發現有效數據// sparseArr[?][0]=i;//第一列的值就是該有效元素的行數// sparseArr[?][1]=j;//第二列的值就是該有效元素的列數// sparseArr[?][2]=chessArr1[i][j];//第三列的值就是該有效元素其本身count++;sparseArr[count][0] = i;sparseArr[count][1] = j;sparseArr[count][2] = chessArr1[i][j];}}}// 保存稀疏數組File file = new File("C:\\Users\\18147\\Desktop\\map.data");//這里寫你創建文件的地址,我是直接在桌面上創建了一個FileOutputStream fos = new FileOutputStream(file);OutputStreamWriter write = new OutputStreamWriter(fos, "UTF-8");// 輸出稀疏數組的形式System.out.println();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]);if (i == sparseArr.length - 1) {write.append(sparseArr[i][0] + "," + sparseArr[i][1] + "," + sparseArr[i][2]);} else {write.append(sparseArr[i][0] + "," + sparseArr[i][1] + "," + sparseArr[i][2] + ",");}}System.out.println("寫入文件中...");write.close();fos.close();System.out.println("打開文件中...");Desktop.getDesktop().open(file);System.out.println("------------------------------先讀取_map.data");// 創建 FileReader 對象FileInputStream fis = new FileInputStream(file);InputStreamReader reader = new InputStreamReader(fis, "UTF-8");StringBuffer sb = new StringBuffer();while (reader.ready()) {sb.append((char) reader.read());// 轉成char加到StringBuffer對象中}System.out.println(sb.toString());reader.close();// 關閉讀取流fis.close();// 關閉輸入流,釋放系統資源System.out.println("------------------------------恢復成稀疏數組_sparseArrHf");System.out.println();System.out.println("壓縮成稀疏數組表現為:");// 遍歷打印稀疏數組for (int i = 0; i < sparseArr.length; i++) {// 格式化輸出每一行的三列數,并且每打印三個數換行System.out.printf("%d\t %d\t %d\t", sparseArr[i][0], sparseArr[i][1], sparseArr[i][2]);System.out.println();}// 將稀疏數組轉換為二維數組的思路// 1.讀取稀疏數組第一行的值,根據第一行的值來創建原始的二維數組int[][] chessArr2 = new int[sparseArr[0][0]][sparseArr[0][1]];// 2.讀取后幾行的數據填充二維數組for (int i = 1; i < sparseArr.length; i++) {// 因為是從第二行開始讀數的,所以要從i=1開始chessArr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];}// 輸出原始的二維數組System.out.println();System.out.println("打印恢復后的二維數組");for (int[] row : chessArr2) {for (int data : row) {System.out.printf("%d\t", data);}System.out.println();}} }運行結果圖:
總結
以上是生活随笔為你收集整理的Java实现二维数组和稀疏数组的转换的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 打印图形(2)(直角三角形)(C+Jav
- 下一篇: 网曝小米手机系统出现中文错别字 手机是R