1. 程式人生 > 實用技巧 >資料結構(1):稀疏陣列使用java實現

資料結構(1):稀疏陣列使用java實現

    主要是用於陣列壓縮,去除無效的陣列內容:

   

原陣列內容:
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) throws
IOException, 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();

    }
}