Java数据结构Day1----稀疏数组

鄙人决定利用最近做实时项目的业余时间,把java的数据结构和算法简单学习一下

目录

稀疏数组

编码


稀疏数组

记录数据一共有几行几列,有多少个不同的值,把具有不同值的元素的行列记录在一个小规模的数组中,以达到缩小数据规模的目的

例如上图这个二维数组,是11*11的结构,但是里面只有两个特殊值(非0),所以我们如果用稀疏数组来表示的话,可以极大的减小它的规模

 上图就是我们转换出来的稀疏数组,有什么含义呢??

上图已经解释的比较清楚了!

ok 现在进入代码阶段

编码

1.将原有的多维数组转换为稀疏数组

int[][] chessArr1 = new int[11][11];
        chessArr1[1][2] = 1;
        chessArr1[2][3] = 2;
        System.out.println("==========原始的多维数组===========");
         TODO: 2021/11/23 输出原始的二维数组
        for (int[] arr : chessArr1){
            for (int i : arr){
                System.out.printf("%d\t",i);
            }
            System.out.println();
        }

先把原始的多维数组创建出来(这个二维数组对应最前面的图)

上图变量:        chessArr1(译:棋盘数组-->可视为一个多维数组)

1.1        首先我们获取原数组中特殊值的个数

 TODO: 2021/11/23 首先,先获得有值的个数
        int sum = 0;
        for (int i = 0; i < 11; i++) {
            for (int j = 0; j < 11; j++) {
                if (chessArr1[i][j] != 0) {
                    sum ++;
                }
            }
        }

在双重for循环遍历之中,只要有不等于0的数字,该位置便是一个特殊值.用sum变量来记录

1.2        创建稀疏数组

 TODO: 2021/11/23 创建稀疏数组
        int[][] sparseArr1 = new int[sum + 1][3];
        sparseArr1[0][0] = 11;
        sparseArr1[0][1] = 11;
        sparseArr1[0][2] = sum;

 对于一个二维数组,对应的稀疏矩阵就是三列    分别对应 行号、列号、特殊值

因为稀疏矩阵还需要描述原数组的结构,所以行数应该是特殊值的个数加1,即sum+1
然后第一行的数据就是 11*11 有sum个特殊值

1.3        给稀疏数组赋值

 TODO: 2021/11/23 遍历数组,将值填入稀疏数组中
        int count = 1;
        for (int i = 0; i < 11; i++) {
            for (int j = 0; j < 11; j++) {
                if (chessArr1[i][j] != 0){
                    sparseArr1[count][0] = i;
                    sparseArr1[count][1] = j;
                    sparseArr1[count][2] = chessArr1[i][j];
                    count++;
                }
            }
        }
        System.out.println("==================稀疏数组===================");
         TODO: 2021/11/23 遍历打印稀疏数组
        for (int[] arr : sparseArr1){
            System.out.printf("%d\t%d\t%d",arr[0],arr[1],arr[2]);
            System.out.println();
        }

 再次遍历原二维数组,将检查为特殊值的行号列号和值保存到稀疏数组之中

2.将稀疏数组转换为多维数组

  TODO: 2021/11/23 将稀疏数组转换多维数组
        int[][] chessArr2 = new int[sparseArr1[0][0]][sparseArr1[0][1]];
        for (int i = 1; i < sparseArr1.length; i++) {
            chessArr2[sparseArr1[i][0]][sparseArr1[i][1]] = sparseArr1[i][2];
        }
        System.out.println("===================转换出的多维数组===============");
         TODO: 2021/11/23 打印转换出的多维数组
        for (int[] ints : chessArr2) {
            for (int anInt : ints) {
                System.out.printf("%d\t",anInt);
            }
            System.out.println();
        }

2.1        通过稀疏数组的第一行数据把原始数组创建出来

2.2        通过稀疏数组的后面几行进行特殊值的赋值

3.写入及写出

 TODO: 2021/11/23 将求出的稀疏数组保存到文件中
        FileWriter fileWriter = new FileWriter("output/sparseArray.txt");
        for (int i = 0; i < sparseArr1.length; i++) {
            for (int j = 0; j < 3; j++) {
                fileWriter.write(sparseArr1[i][j] + "\t");
            }
            fileWriter.write("\n");
        }
        fileWriter.close();
        System.out.println("写入文件成功");
        System.out.println("=============读取文件中的内容==========");
         TODO: 2021/11/23 从文件中读取数据
        BufferedReader bufferedReader1 = new BufferedReader(new InputStreamReader(new FileInputStream("output/sparseArray.txt")));
        int cnt1 = 0;
        while (true){
            String s = bufferedReader1.readLine();
            if (s == null) {
                break;
            }
            cnt1 ++;
        }
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream("output/sparseArray.txt")));
        //获取到了稀疏数组的大小,现在来创建
        int[][] sparseArr3 = new int[cnt1][3];
        //现在来进行赋值
        int cnt2 = 0;
        while (true){
            String s = bufferedReader.readLine();
            if (s == null) {
                break;
            }
            String[] split = s.split("\t");
            sparseArr3[cnt2][0] = Integer.parseInt(split[0]);
            sparseArr3[cnt2][1] = Integer.parseInt(split[1]);
            sparseArr3[cnt2][2] = Integer.parseInt(split[2]);
            cnt2++;
        }
         TODO: 2021/11/23 将读到的sparseArr3 恢复成多维数组
        int[][] chessArr3 = new int[sparseArr3[0][0]][sparseArr3[0][1]];
        // 给多维数组赋值
        for (int i = 1; i < sparseArr3.length; i++) {
            chessArr3[sparseArr3[i][0]][sparseArr3[i][1]] = sparseArr3[i][2];
        }
        //打印以下多维数组chessArr3
        for (int[] ints : chessArr3) {
            for (int anInt : ints) {
                System.out.print(anInt+"\t");
            }
            System.out.println();
        }
        //关闭缓冲流
        bufferedReader.close();

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

徐一闪_BigData

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值