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