資料結構(1):稀疏陣列使用java實現
阿新 • • 發佈:2020-12-21
主要是用於陣列壓縮,去除無效的陣列內容:
原陣列內容:
0 0 0 0 0
0 1 0 0 0
0 0 0 2 0
0 0 0 0 0
0 0 0 0 0
轉換成
稀疏陣列
5 5 2
1 1 1
2 3 2
程式碼實現:
package Array_Test; import java.io.*; public class Test4 { public static void main(String[] args) throwsIOException, ClassNotFoundException { writeFile("/Users/maniac/Sparse.txt"); readFile("/Users/maniac/Sparse.txt"); } public static void readFile(String filename) throws IOException, ClassNotFoundException { File file =new File(filename); FileInputStream fileInputStream=new FileInputStream(file); ObjectInputStream objectInputStream =new ObjectInputStream(fileInputStream); int[][] data = (int[][]) objectInputStream.readObject(); System.out.println("反序列化:"); for(int i=0;i<data.length;i++){ for(int j=0;j<data[i].length;j++){ System.out.printf("%d\t",data[i][j]); } System.out.println(); } //還原成二維陣列 int[][] array = new int[data[0][0]][data[0][1]]; //輸出預設陣列 5x5: System.out.println("預設陣列:"); for(int d[]:array){ for(int t:d){ System.out.printf("%d\t",t); } System.out.println(); } //稀疏陣列賦值給二維陣列 //賦值不需要稀疏陣列第一行資料去除掉,從第二行開始。 //列是固定的 for(int i=1;i<data.length;i++){ //data[i][0] = 1,2 //data[i][1] = 1,3 //data[i][2] = 1,2 結果 //相當於 1-1 2-3 array[data[i][0]][data[i][1]] = data[i][2]; } //輸出二維陣列 System.out.println("稀疏陣列還原二維陣列:"); for(int i=0;i<array.length;i++){ for(int j=0;j<array[i].length;j++){ System.out.printf("%d\t",array[i][j]); } System.out.println(); } } public static void writeFile(String filename) throws IOException { int[][] data =new int[5][5]; data[1][1] = 1; data[2][3] = 2; System.out.println("原陣列內容:"); for(int d[]:data){ for(int t:d){ System.out.printf("%d\t",t); } System.out.println(); } // 原陣列轉稀疏資料 // 獲取有效原陣列資料 int sum = 0; for(int i=0;i<data.length;i++){ for(int j=0;j<data[i].length;j++){ if(data[i][j]!=0){ sum++; } } } System.out.println("二維陣列有效資料有"+sum+"個"); int[][] array2 = new int[sum+1][3]; //已知稀疏陣列固定3列 array2[0][0] = data.length; array2[0][1] = data.length; array2[0][2] = sum; //把二維陣列賦值給稀疏陣列 int num =0 ; for(int i=0;i<data.length;i++){ for(int j=0;j<data[i].length;j++){ if(data[i][j]!=0){ num++; //第一行已經設定好內容,從第二行開始就是1開始賦值 array2[num][0]=i; array2[num][1]=j; //把原始陣列中存在的內容賦值給第三列資料 array2[num][2]=data[i][j]; } } } System.out.println("輸出稀疏陣列內容:"); for(int i=0;i<array2.length;i++){ for(int j=0;j<array2[i].length;j++){ System.out.printf("%d\t",array2[i][j]); } System.out.println(); } //序列化陣列物件 File file =new File(filename); ObjectOutputStream objectOutputStream =new ObjectOutputStream(new FileOutputStream(file)); objectOutputStream.writeObject(array2); objectOutputStream.close(); } }
輸出:
原陣列內容: 0 0 0 0 0 0 1 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 二維陣列有效資料有2個 輸出稀疏陣列內容: 5 5 2 1 1 1 2 3 2 反序列化: 5 5 2 1 1 1 2 3 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 1 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0
java陣列即物件:
物件即類創建出來的例項。物件具有各種屬性,並且具有一些特定的行為,物件是記憶體中的記憶體塊,在這個記憶體塊中封裝了一些資料,也就是類中定義的各個屬性,所以物件就是用來封裝資料。 陣列就是封裝資料,如果定義int型別他就是儲存int型別資料package Array_Test;public class Test { public static void main(String[] args) { //陣列的父類是Object int[] a=new int[8]; String[] data = new String[8]; Object b = a; Object[] c=data; int length = a.length; if(b instanceof int[]){ System.out.println("obj的真實型別是int[]"); } //Object類內建方法 // a.hashCode(); System.out.println(length); System.out.println(a.getClass().getName()); System.out.println(a.getClass().getSuperclass().getName()); Father.Son son =new Father.Son(); Father.Son[] sons =new Father.Son[8]; Father.Father2[] fa = sons; System.out.println(sons.getClass().getSuperclass().getName()); } }陣列即物件,他的父型別是object型別。 序列化和反序列化就是序列化物件,然後在反序列化物件,原封不動還原物件內容: 序列化然後反序列化:
package Array_Test; import java.io.*; import java.util.Arrays; public class Test2 { public static void main(String[] args) throws IOException, ClassNotFoundException { // writeFile("/Users/maniac/array1.txt"); readFile("/Users/maniac/array1.txt"); } public static void readFile(String filename) throws IOException, ClassNotFoundException { FileInputStream fileInputStream =new FileInputStream(new File(filename)); ObjectInputStream objectInputStream =new ObjectInputStream(fileInputStream); int[] d= (int[]) objectInputStream.readObject(); System.out.println(d.length); System.out.println(Arrays.toString(d)); } public static void writeFile(String filename) throws IOException { int[] data =new int[8]; data[0]=1; FileOutputStream fileOutputStream =new FileOutputStream(new File(filename)); ObjectOutputStream objectOutputStream =new ObjectOutputStream(fileOutputStream); // 序列化陣列物件 objectOutputStream.writeObject(data); objectOutputStream.close(); } }