JAVA数据结构与算法【稀疏数组】
先看一個實際的需求:
基本介紹
? ? ?當一個數組中大部分元素為0,或者為同一個值的數組時,可以使用稀疏數組來保存該數組。
稀疏數組的處理方法是:
舉例說明:
我們清晰的看出,數組由6*7,改用稀疏數組后為3*8
應用實例
- 二維數組換稀疏數組的思路
- 稀疏數組轉原始數組的思路
代碼實現
package com.henu.sparsearray;/*** @author George* @description 稀疏數組**/ public class SparseArray {public static void main(String[] args) {//創建一個原始的二維數組 11*11//0:表示沒有棋子,1表示黑子 2表示藍字int chessArr1[][] = new int[11][11];chessArr1[1][2] = 1;chessArr1[2][3] = 2;chessArr1[4][5] = 2;//輸出原始的二維數組System.out.println("原始的二維數組:");for (int[] row : chessArr1) {for (int data : row) {System.out.printf("%d\t",data); // System.out.print(data + "\t");}System.out.println();}//將二維數組 轉 稀疏數組的思路//1.先遍歷二維數組,得到非零數據的個數。int sum = 0;for (int i = 0; i < 11; i++) {for (int j = 0; j < 11; j++) {if (chessArr1[i][j] != 0){sum++;}}}//創建對應的稀疏數組int[][] sparseArr = new int[sum + 1][3];//給稀疏數組賦值sparseArr[0][0] = 11;sparseArr[0][1] = 11;sparseArr[0][2] = sum;//遍歷二維數組,將非0的值存放到sparseArr中int count = 0;//count用于記錄第幾個非0數據for (int i = 0; i < 11; i++) {for (int j = 0; j < 11; j++) {if (chessArr1[i][j] != 0) {count++;sparseArr[count][0] = i;sparseArr[count][1] = j;sparseArr[count][2] = chessArr1[i][j];}}}//輸出稀疏數組的形式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]);}System.out.println();//將稀疏數組=》恢復成原始的二維數組/*** 1.先讀取稀疏數組的第一行,根據第一行的數據,創建原始的二維數組* 比如上面的chessArr2 = int[11][11]* 2.在讀取稀疏數組后幾行的數據,并賦給原始的二維數組即可*///1.先讀取稀疏數組的第一行,根據第一行的數據,創建原始的二維數組int[][] chessArr2 = new int[sparseArr[0][0]][sparseArr[0][1]];//2.在讀取稀疏數組后幾行的數據(從第二行開始),并賦給原始的二維數組 即可for (int i = 1; i < sparseArr.length; i++) {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();}}}結果展示:
原始的二維數組:
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?? ?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?? ?
得到的稀疏數組是:
11?? ?11?? ?3?? ?
1?? ?2?? ?1?? ?
2?? ?3?? ?2?? ?
4?? ?5?? ?2?? ?
恢復好的二維數組:
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?? ?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
拓展:
要求,1.在前面的基礎上,將稀疏數組保存在磁盤上,比如map.data
2.恢復原來的數組時,讀取map.data進行恢復。
【因為我們都知道,在玩游戲中,我們都有存檔退出這一說。所以這個就是實現我們所說的存檔退出。然后下次開啟是繼續游戲。】
存檔:
package com.henu.sparsearray;import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException;/*** @author George* @description 稀疏數組存檔**/ public class SparseArrayWrite {public static void main(String[] args) throws IOException {//創建一個原始的二維數組 11*11//0:表示沒有棋子,1表示黑子 2表示藍字int chessArr1[][] = new int[11][11];chessArr1[1][2] = 1;chessArr1[2][3] = 2;chessArr1[4][5] = 2;//輸出原始的二維數組System.out.println("原始的二維數組:");for (int[] row : chessArr1) {for (int data : row) {System.out.printf("%d\t", data); // System.out.print(data + "\t");}System.out.println();}//將二維數組 轉 稀疏數組的思路//1.先遍歷二維數組,得到非零數據的個數。int sum = 0;for (int i = 0; i < 11; i++) {for (int j = 0; j < 11; j++) {if (chessArr1[i][j] != 0) {sum++;}}}//創建對應的稀疏數組int[][] sparseArr = new int[sum + 1][3];//給稀疏數組賦值sparseArr[0][0] = 11;sparseArr[0][1] = 11;sparseArr[0][2] = sum;//遍歷二維數組,將非0的值存放到sparseArr中int count = 0;//count用于記錄第幾個非0數據for (int i = 0; i < 11; i++) {for (int j = 0; j < 11; j++) {if (chessArr1[i][j] != 0) {count++;sparseArr[count][0] = i;sparseArr[count][1] = j;sparseArr[count][2] = chessArr1[i][j];}}}//保存BufferedWriter bw = new BufferedWriter(new FileWriter("./data/map.data"));System.out.println();System.out.println("進行存檔。。。");for (int i = 0; i < sparseArr.length; i++) {String s = "" + sparseArr[i][0] + "\t" + sparseArr[i][1] + "\t" + sparseArr[i][2] + "\t\n";bw.write(s);}bw.close();} }讀檔:
package com.henu.sparsearray;import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.List;/*** @author George* @description 讀檔**/ public class SparseArrayRead {public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new FileReader("./data/map.data"));List<String> list = new ArrayList<>();String s = "";while ((s = br.readLine()) != null){list.add(s);}int[][] newSparseArrayRead = new int[list.size()][list.size()-1];String s1 = list.get(0);String[] split = s1.split("\t");//先將11 11 3放入數組中newSparseArrayRead[0][0] = Integer.parseInt(split[0]);newSparseArrayRead[0][1] = Integer.parseInt(split[1]);newSparseArrayRead[0][2] = list.size()-1;//設置count值,進行后面的判斷。二維數組的行數。int count = 0;for (int i = 1; i < list.size(); i++) {String str = list.get(i);String[] strings = str.split("\t");count ++;for (int j = 0; j < strings.length; j++) {newSparseArrayRead[count][j] = Integer.parseInt(strings[j]);}}System.out.println("讀取文件后建立的稀疏數組:");for (int[] ints : newSparseArrayRead) {for (int anInt : ints) {System.out.printf("%d\t",anInt);}System.out.println();}//從二維數組轉換為原始數組//1.先讀取稀疏數組的第一行,根據第一行的數據,創建原始的二維數組int[][] chessArr2 = new int[newSparseArrayRead[0][0]][newSparseArrayRead[0][1]];//2.在讀取稀疏數組后幾行的數據(從第二行開始),并賦給原始的二維數組 即可for (int i = 1; i < newSparseArrayRead.length; i++) {chessArr2[newSparseArrayRead[i][0]][newSparseArrayRead[i][1]] = newSparseArrayRead[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();}br.close();} }?
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
以上是生活随笔為你收集整理的JAVA数据结构与算法【稀疏数组】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JAVA的System.out.prin
- 下一篇: JAVA数据结构与算法【队列、数组模拟(