稀疏数组及io写入和读取

package com.main.dataStructures;

import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

//1.创建一个二维数组
//2.将二维数组转换为稀疏数组
//3.将稀疏数组保存到磁盘中
//4.读取磁盘中的文件,转换为稀疏数组
//5.将稀疏数组转换为二维数组
public class SparseArray {
    public static void main(String[] args) throws IOException {
        /*
         * 第 1 步:创建一个二维数组
         */
        //创建一个原始的二维数组11 * 11
        //0:表示没有棋子,1表示黑子,2表示白子
        int[][] arr = new int[11][11];
        arr[1][2] = 1;
        arr[2][3] = 2;
        System.out.println("原始的二维数组:");
        for (int[] ar :arr) {
            for (int data : ar) {
                System.out.printf("\t" + data);
            }
            System.out.println();
        }
        /*
         * 第 2 步:将二维数组转换为稀疏数组
         *
         * *将二维数组转换为稀疏数组的思想:
         * 1.先遍历二维数组,得到非 0 的数据个数
         * 2.创建对应的大小的稀疏数组
         * 3.再次遍历二维数组,将非 0 的值存入稀疏数组
         */
        //1.遍历二维数组 得到非0数据的个数sum
        int sum = 0;
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[0].length; j++) {
                if (arr[i][j] != 0){
                    sum++;
                }
            }
        }
        //2.根据sum创建对应大小的稀疏数组
        int sparseArr[][] = new int[sum+1][3];
        sparseArr[0][0] = 11;
        sparseArr[0][1] = 11;
        sparseArr[0][2] = sum;
//        3.再次遍历二维数组,将非 0 的值存入稀疏数组
        int count = 0;
        for (int i = 1; i < arr.length; i++) {
            for (int j = 0; j < arr[0].length; j++) {
                if (arr[i][j] != 0){
                    count++;
                    sparseArr[count][0] = i;
                    sparseArr[count][1] = j;
                    sparseArr[count][2] = arr[i][j];
                }
            }

        }
        // 输出稀疏数组
        System.out.println("稀疏数组为:");
        for (int i = 0; i < sparseArr.length; i++) {
            System.out.printf("%d\t%d\t%d\t\n",sparseArr[i][0],sparseArr[i][1],sparseArr[i][2]);
        }
        /*
         * 第 3 步:将稀疏数组保存到磁盘中
         */
        writeSparse(sparseArr);
        /*
         * 第 4 步:读取磁盘中的文件,转换为稀疏数组
         */
        int[][] sparseArr2 = readSparse();
        /*
         * 第 5 步:将稀疏数组转换为二维数组
         *
         * 1.先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组
         * 2.再读取稀疏数组后几行的数据,并赋值给原始的二维数组
         */
        //如果读取的文件中有数据,那么将该稀疏数组转换为二维数组
        //1.先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组
        int [][]arr2 = new int[sparseArr2[0][0]][sparseArr2[0][1]];
        //2.再根据稀疏数组第二行记录的内容,更新二维数组
        for (int i = 1; i < sparseArr2.length; i++) {
            arr2[sparseArr2[i][0]][sparseArr2[i][1]] = sparseArr2[i][2];
        }
        //3.输出转换后的二维数组
        System.out.println("\n还原后的二维数组:");
        for (int[] ar :arr2) {
            for (int data : ar) {
                System.out.printf("\t" + data);
            }
            System.out.println();
        }
    }
    //将稀疏数组写入到磁盘中的方法
    public static void writeSparse(int[][] sparseArr) throws IOException {
        File file = new File("E:\\code\\sparseArray.txt");
        if(!file.exists()){
            file.createNewFile();
        }
        FileWriter fileWriter = new FileWriter(file);
        for (int i = 0; i < sparseArr.length; i++) {
            //数据前n-1列尾部加入"\t"
            for (int j = 0; j < sparseArr[0].length-1; j++) {
                fileWriter.write(sparseArr[i][j]+"\t");
            }
            //数组最后一列后面不加"\t"
            fileWriter.write(sparseArr[i][sparseArr[0].length-1]+"");
            //换行
            fileWriter.write("\n");
        }
        fileWriter.flush();
        fileWriter.close();
    }

    //读取磁盘中的文件,转换为稀疏数组
    public static int[][] readSparse() throws IOException {
        File file1 = new File("E:\\code\\sparseArray.txt");
        FileReader fileReader = new FileReader(file1);
        //通过BufferedReader包装字符输入流
        BufferedReader readerBuf = new BufferedReader(fileReader);
        //创建一个集合,用来存放读取的文件的数据
        List<String> strList = new ArrayList<>();
        //用来存放一行的数据
        String lineStr;
        //逐行读取txt文件中的内容
        while((lineStr = readerBuf.readLine()) != null) {
            //9.把读取的行添加到list中
            strList.add(lineStr);
        }
        //获取文件有多少行
        int lineNum = strList.size();
        //根据文件行数创建对应的数组
        int [][]sparseArr = new int[lineNum][3];
        //记录输出当前行
        int count = 0;
        //循环遍历集合,将集合中的数据放入数组中
        for(String str : strList) {
            //将读取的str按照","分割,用字符串数组来接收
            String[] strs = str.split("\t");
            sparseArr[count][0] = Integer.valueOf(strs[0]);
            sparseArr[count][1] = Integer.valueOf(strs[1]);
            sparseArr[count][2] = Integer.valueOf(strs[2]);
            //将行数 + 1
            count++;
        }
        fileReader.close();// 关闭输入流,释放连接
        readerBuf.close();//关闭字符输入缓冲流
        return sparseArr;//返回稀疏数组
    }

}

结果如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
原创:大佬博客

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值