数据结构(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();

    }
}

 

 

 

 

 参考:韩顺平java数据结构和算法

    

posted @ 2020-12-21 17:31  飘渺红尘✨  阅读(141)  评论(0编辑  收藏  举报
Title