JAVA稀疏数组-二维数组的压缩以及写入与读取

个人学习记录:希望大家能多多交流 提出宝贵意见 互帮互助 共同进步

喜欢把注释写的比较详细,可忽略。

加油!加油!加油!

 

package com.eliauk.sparsearray;

import java.io.*;

/**
 * @author  Eliauk
 * @version 1.0.0
 * @ClassName SparseArrayToFileAgin.java
 * @Description 稀疏数组的转化过程和硬盘存储以及读取的IO流
 * @createTime 2021年05月12日 09:17:00
 */
public class SparseArrayToFileAgin {

    public static void main(String[] args) {
        /**
         * 1.创建一个二维数组,实现二维数组对稀疏数组的过程转化
         * 2.将稀疏数组写入到硬盘中
         * 3.读取硬盘中的数据,恢复成原二维数组
         */
        //创建二维数组
        int chessArray[][] = new int[11][12];
        chessArray[1][1] = 1;
        chessArray[2][2] = 2;
        chessArray[3][3] = 3;
        chessArray[4][4] = 4;
        //SUM 记录数组中的有效元素
        int sum = 0;
        for(int[] row : chessArray){
            for(int temp : row){
                if(temp != 0){
                    sum++;
                }
                System.out.printf("%d\t",temp);
            }
            System.out.println("");
        }

        System.out.println("数组中有效元素的个数为:"+sum);

        //创建稀疏数组
        int sparseArray[][] = new int[sum+1][3];
        //给稀疏数组赋值
        sparseArray[0][0] = chessArray.length;
        sparseArray[0][1] = chessArray[0].length;
        sparseArray[0][2] = sum;
        //定义一个迭代器  用来记录稀疏数组的行数
        int count = 0;
        for(int i = 0;i<chessArray.length;i++){
            for(int j = 0;j<chessArray[0].length;j++){
                if(chessArray[i][j] != 0){
                    count++;
                    sparseArray[count][0] = i;
                    sparseArray[count][1] = j;
                    sparseArray[count][2] = chessArray[i][j];
                }
            }
        }

        System.out.println("得到的稀疏数组为:");

        for(int i = 0;i<sparseArray.length;i++){
            System.out.printf("%d\t%d\t%d\t\n",sparseArray[i][0],sparseArray[i][1],sparseArray[i][2]);
        }

        //将稀疏数组写入到桌面文件中  C:\Users\XXX\Desktop\data.txt   路径自定义
        File file = new File("C:\\Users\\XXX\\Desktop\\data.txt");
        try {
            FileOutputStream out = new FileOutputStream(file);
            OutputStreamWriter writer = new OutputStreamWriter(out,"UTF-8");

            for(int i = 0;i<sparseArray.length;i++){
                if(i == sparseArray.length-1){
                    writer.write(sparseArray[i][0]+","+sparseArray[i][1]+","+sparseArray[i][2]);
                }else{
                    writer.write(sparseArray[i][0]+","+sparseArray[i][1]+","+sparseArray[i][2]+",");
                }
            }

            //关闭流释放资源
            writer.close();
            out.close();

            //读取硬盘上的数据
            FileInputStream input = new FileInputStream(file);
            InputStreamReader reader = new InputStreamReader(input,"UTF-8");
            StringBuffer buffer = new StringBuffer();
            while (reader.ready()){
                buffer.append((char) reader.read());
            }

            String str = buffer.toString();
            System.out.println("写入硬盘的数据为: "+str);
            String sb1[] = str.split(",");
            //新建一个空的稀疏数组
            int sparseArray2[][] = new int[sb1.length/3][3];
            //给稀疏数组赋值
            int count1 = 0;
            for(int i = 0;i<sparseArray2.length;i++){
                sparseArray2[i][0] = Integer.parseInt(sb1[count1]);
                sparseArray2[i][1] = Integer.parseInt(sb1[count1+1]);
                sparseArray2[i][2] = Integer.parseInt(sb1[count1+2]);
                count1+=3;
            }

            reader.close();
            input.close();

            System.out.println("读取到的硬盘中的稀疏数组为:");
            for(int[] row : sparseArray2){
                for(int temp : row){
                    System.out.printf("%d\t",temp);
                }
                System.out.println("");
            }
            
            //将稀疏数组恢复成二维数组
            int chessArray2[][] = new int[sparseArray2[0][0]][sparseArray2[0][1]];
            for(int i = 1;i<sparseArray2.length;i++){
                chessArray2[sparseArray2[i][0]][sparseArray2[i][1]] = sparseArray2[i][2];
            }

            System.out.println("恢复后的二维数组为: ");

            for(int[] row : chessArray2){
                for(int temp : row){
                    System.out.printf("%d\t",temp);
                }
                System.out.println("");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

控制台展示结果:

原自定义二维数组:
0	0	0	0	0	0	0	0	0	0	0	0	
0	1	0	0	0	0	0	0	0	0	0	0	
0	0	2	0	0	0	0	0	0	0	0	0	
0	0	0	3	0	0	0	0	0	0	0	0	
0	0	0	0	4	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	
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	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	0	
数组中有效元素的个数为:4
得到的稀疏数组为:
11	12	4	
1	1	1	
2	2	2	
3	3	3	
4	4	4	
写入硬盘的数据为: 11,12,4,1,1,1,2,2,2,3,3,3,4,4,4
读取到的硬盘中的稀疏数组为:
11	12	4	
1	1	1	
2	2	2	
3	3	3	
4	4	4	
恢复后的二维数组为: 
0	0	0	0	0	0	0	0	0	0	0	0	
0	1	0	0	0	0	0	0	0	0	0	0	
0	0	2	0	0	0	0	0	0	0	0	0	
0	0	0	3	0	0	0	0	0	0	0	0	
0	0	0	0	4	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	
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	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	0	

重点在于知道稀疏数组的行和列代表的含义。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值