zoukankan      html  css  js  c++  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	",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);
                }
                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	",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);
                }
                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	",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数据结构和算法

        

  • 相关阅读:
    4.2说说计算机中的异常
    1.1组合电路、时序电路在计算机课程中的地位
    EFM32JG系列MCU内部温度传感器使用方法
    +7虚拟内存的作用,通过什么方式提高虚拟内存的性能
    +6存储结构是怎样提高性能的,它和局部性的关系是什么。
    +5性能分析定律
    +4 高速缓存
    +3软件优化至关重要,软件优化一般有哪些方法?
    +2流水线是怎样提高性能的,会遇到什么问题,解决方法是什么
    +1阿姆达尔定律
  • 原文地址:https://www.cnblogs.com/piaomiaohongchen/p/14169031.html
Copyright © 2011-2022 走看看