二维数组转稀疏数组小练习(涵盖将数据存入磁盘)

该文章展示了一个使用Java进行二维数组到稀疏数组转换的过程,包括将数据存入磁盘和从磁盘读取,然后重新转换回二维数组。主要涉及数组操作、文件I/O和数据压缩概念,适用于节省存储空间的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

四个步骤

1、将原始二维数组转为稀疏数组

2、将数据存入磁盘

3、从磁盘读取数据,为稀疏数组

4、再将读取到的稀疏数组转为原始二维数组

代码实现:

        代码主体(重构后的)

import java.io.*;

public class Array{

    public static void main(String[] args) throws IOException {

        // 自定义一个文件名
        String fileName = "./arr.data";
        
        // 假设一个原始二维数组数据
        int[][] chessArr = new int[11][11];
        chessArr[1][2]=1;
        chessArr[2][3]=2;
        chessArr[2][2]=1;
        chessArr[3][2]=2;
        System.out.println("原始棋盘数据:");
        printArray(chessArr);
        

        // 转为稀疏数组
        int[][] sparseArr = chessArrToSparesArr(chessArr);
        System.out.println("-----------------------");
        System.out.println("原始数据转为稀疏数组后:");
        printArray(sparseArr);


        //存入磁盘
        File file = saveFile(sparseArr,fileName);

        // 从磁盘中读取数据
        int[][] sparseArray = getSparseArrayFromFile(file);

        System.out.println("-----------------------");
        System.out.println("文件中读取稀疏数组:");
        printArray(sparseArray);
        

        // 转为原始数组
        int[][] chessArr2 = sparseArrToChessArr(sparseArray);
        System.out.println("-----------------------");
        System.out.println("文件中读取稀疏数组后转为原始数据:");
        printArray(chessArr2);

    }

        原始数据长这样:

        

      二维数组转稀疏数组( chessArrToSparesArr(int[][] arr)函数)

private int[][] chessArrToSparesArr(int[][] chessArr) {
        // 稀疏数组是固定的3列
        // 要确定原始数据有多少非零元素

        int sum = 0;
        for (int[] ints : chessArr) {

            for (int j = 0; j < ints.length; j++) {

                if (ints[j] != 0) {
                    sum++;
                }
            }

        }
        
        // 初始化,并赋值第一行数据
        int[][] sparseArr=new int[sum+1][3];

        sparseArr[0][0]= chessArr.length;

        sparseArr[0][1]= chessArr.length; // 这里应该灵活改变(应该是上面那个ints.length)

        sparseArr[0][2]= sum;


        // 为剩余的行列赋值
        int count=0;

        for (int i = 0; i < chessArr.length; i++) {

            for (int j = 0; j < chessArr.length; j++) {

                if(chessArr[i][j] != 0){

                    count++;

                    sparseArr[count][0]=i;

                    sparseArr[count][1]=j;

                    sparseArr[count][2]=chessArr[i][j];

                }

            }

        }

        return sparseArr;

    }

转换之后长这样:

        

将数据存入磁盘(saveFile(int[][] arr,String fileName)函数)

private File saveFile(int[][] sparseArr, String fileName) throws IOException {

        // 思路就是直接将数组的一行,作为一整个字符串写入,比较方便

        File file = new File(fileName);

        FileWriter fileWriter = null;

        try {

            fileWriter = new FileWriter(file);

            for (int[] ints : sparseArr) {

                // 这里用什么字符做间隔符,读取的时候也一定要同样的
                fileWriter.write(ints[0] + "\t" + ints[1] + "\t" + ints[2]);

                fileWriter.write(System.getProperty("line.separator"));
                //获取当前系统所需的换行符 \r、\n、\r\n

            }

        } catch (Exception e) {

            throw new RuntimeException(e);

        }

        fileWriter.close();

        return file;

    }

如果想看存入文件之后长什么样,fileName后缀可以改为".txt"的格式

        

 数据回溯--从磁盘文件中读取数据(getSparseArrFromFile(String file)函数)

private int[][] getSparseArrayFromFile(File file) throws IOException {

        FileReader fileReader = new FileReader(file);

        //创建字符读取缓冲流

        BufferedReader bufferedReader = new BufferedReader(fileReader);

        int[][] sparseArray = null;

        String readLine = null ;  // 用来储存读取的一行字符串

        int count1=0; //

        while ((readLine = bufferedReader.readLine()) != null){

            String[] tempStr = readLine.split("\t");
           //  根据前面自己定义的正则表达式的匹配拆分此字符串。

            //判断数组是否创建,未创建则创建

            if(sparseArray == null){

                sparseArray = new int[Integer.parseInt(tempStr[2])+1][3];

            }

            sparseArray[count1][0] = Integer.parseInt(tempStr[0]);

            sparseArray[count1][1] = Integer.parseInt(tempStr[1]);

            sparseArray[count1][2] = Integer.parseInt(tempStr[2]);

            count1++;

        }

        fileReader.close();

        return sparseArray;

    }

数据还长原来那样,就不放图了

最后一步,重新将稀疏数组转为原始的二维数组--

sparseArrToChessArr(int[][] sparseArr)函数

private int[][] sparseArrToChessArr(int[][] sparseArray) {
        // 稀疏数组第一行就记录了 原始数组有几行几列,可以直接初始化

        int[][] chessArr=new int[sparseArray[0][0]][sparseArray[0][1]];
            
        // 遍历赋值
        for (int i = 1; i < sparseArray.length; i++) {

            chessArr[sparseArray[i][0]][sparseArray[i][1]]=sparseArray[i][2];

        }

        return chessArr;

    }

结束---

prinlnArr(int[][] arr)函数:

private void printArray(int[][] array){
        if(array == null){
            return;
        }
        for (int[] row : array) {
            System.out.println();
            for (int j : row) {
                System.out.printf("%d\t", j);
            }
            System.out.println();
        }
    }

二维数组转稀疏数组的好处就是,可以去重大量重复的数值,节省空间,如果不同的值多,就不建议了,这也只是一个小demo

要明白稀疏数组的特征

        第一行记录了什么东西,能有多少行

              ​​​​​​

 注意:数组下标是从0开始

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值