稀疏数组(精选)

2023-11-24

思路:

        将数组转为稀疏数组存入文件/数据库,用的时候再取出来

        稀疏数组3列:行,列,值      第一行记录原数组  行数,列数,以及存入的总值

public class SparseArray_01 {
    public static void main(String[] args) {
        //稀疏数组    基本转换
        System.out.println("==========二维-》稀疏==========");
        int[][] ins=new int[10][10];
        ins[1][2]=1;
        ins[2][4]=2;
        for (int i = 0; i < ins.length; i++) {
            for (int j = 0; j < ins[0].length; j++) {
                System.out.print(ins[i][j]+"\t");
            }
            System.out.println();
        }
        int count=0;//记录有效数据个数
        for (int i = 0; i < ins.length; i++) {
            for (int j = 0; j < ins[0].length; j++) {
                if(ins[i][j]!=0){
                    count++;
                }
            }
        }
        System.out.println("有效数据有:"+count+"个");
        int[][] xisu=new int[count+1][3];//创建稀疏数组
        //稀疏数组都一行赋初值
        xisu[0][0]= ins.length;
        xisu[0][1]= ins[0].length;
        xisu[0][2]= count;
        //再次遍历存入稀疏数组
        int k=1;//记录稀疏数组到哪了 以及最后总长度
        for (int i = 0; i < ins.length; i++) {
            for (int j = 0; j < ins[0].length; j++) {
                if(ins[i][j]!=0){
                    xisu[k][0]= i;
                    xisu[k][1]= j;
                    xisu[k][2]= ins[i][j];
                    k++;
                }
            }
        }
        if(k!=count+1){
            System.out.println("error");
        }
        //遍历稀疏数组
        for (int i = 0; i < xisu[0].length; i++) {
            for (int j = 0; j <3; j++) {
                System.out.print(xisu[i][j]+"\t");
            }
            System.out.println();
        }
        System.out.println("==========稀疏-》二维==========");
        int[][] newIns=new int[ xisu[0][0] ][ xisu[0][1] ];
 
        for (int i = 1; i < xisu.length; i++) {     //这里注意是从1开始的
            newIns[ xisu[i][0] ][ xisu[i][1] ]= xisu[i][2];
        }
 
        for (int i = 0; i < newIns.length; i++) {
            for (int j = 0; j < newIns[0].length; j++) {
                System.out.print(newIns[i][j]+"\t");
            }
            System.out.println();
        }
 
 
 
 
    }
}
 
public class SparseArray_02 {
    public static void main(String[] args)  throws Exception {
        //将稀疏数组写入文件,并读出
        int[][] xisu=new int[3][3];
        xisu[0][0]=10;
        xisu[0][1]=10;
        xisu[0][2]=2;
 
        xisu[1][0]=1;
        xisu[1][1]=2;
        xisu[1][2]=1;
 
        xisu[2][0]=2;
        xisu[2][1]=4;
        xisu[2][2]=2;
 
        for (int i = 0; i < xisu.length; i++) {
            for (int j = 0; j < xisu[0].length; j++) {
                System.out.print(xisu[i][j]+"\t");
            }
            System.out.println();
        }
        System.out.println("=========写入=========");
        FileWriter fw=new FileWriter("src\\XiSuShuZu\\sparse.txt");
        for (int i = 0; i < xisu.length; i++) {
            for (int j = 0; j < xisu[0].length; j++) {
               fw.write(xisu[i][j]+"\t");//单独加数字有问题
            }
            fw.write("\n");
        }
        fw.close();
        System.out.println("=========读取=========");
        FileReader fr=new FileReader("src//XiSuShuZu//sparse.txt");
        //扩展一点:读取不知道行,列数,怎么读?
        //读取一个文件/数据库一定是知道大致结构的,不然没有一点意义 ,所以不要用列表
        //像现在这个情况就是知道是 3列,不知道具体多少行
        //但是Java动态二维数组只能是行确定,所以行列的意义要换一下
            // 不行,试过了,动态添加,数组怎么都不行
        //必须先读取一遍,看有多少行,而且因为这个流没有刷新方法,只能看一下x未多少
        BufferedReader brd=new BufferedReader(fr);
        /*
        int x=0;
        while((brd.readLine())!=null){
            x++;
        }
        System.out.println(x);//x是3
        */
        int[][] newXiSu=new int[3][3];//x=3
        String str;
        int y=0;
        while((str=brd.readLine())!=null){
            String[] strings = str.split("\t");
            newXiSu[y][0]=Integer.parseInt(strings[0]);
            newXiSu[y][1]=Integer.parseInt(strings[1]);
            newXiSu[y][2]=Integer.parseInt(strings[2]);
            y++;
        }
 
        for (int i = 0; i < newXiSu.length; i++) {
            for (int j = 0; j < newXiSu[0].length; j++) {
                System.out.print(newXiSu[i][j]+"\t");
            }
            System.out.println();
        }
        brd.close();
        fr.close();
 
    }
}

 

posted @ 2023-11-24 22:21  追梦•少年  阅读(14)  评论(0)    收藏  举报