认识稀疏数组,将稀疏数组存入磁盘并取出

稀疏数组

  1. 第一行:记录原始数组一共有几行几列,几个不同的值
  2. 余下行:把具有不同值的元素的行列及值记录在一个数组中,从而缩小程序的规模

稀疏数组

当一个二维数组的很多值是默认值0,则该数组就记录了很多没有意义的数据。这个时候就可以用稀疏数组了。

  1. 应用实例
    在这里插入图片描述
  2. 分析思路
    在这里插入图片描述
  3. 代码实现
public class SparseArray {
    public static void main(String[] args) {
        //1、11*11的原始棋盘,0为无效数据,1为黑子,2为蓝子
        int[][] chessArr = new int[11][11];

        //2、设置原始棋盘的有效棋子位置
        chessArr[1][1] = 1; //第二列第二行有个黑子
        chessArr[2][2] = 2; //第三列第三行有个蓝子

        //3、获取有效数值个数
        int sum = 0;
        for (int i = 0; i < chessArr.length; i++) {
            for (int j = 0; j < chessArr[i].length; j++) {
                if (chessArr[i][j]!=0){
                    sum++;
                }
            }
        }

        //4、初始化稀疏数组【有效数组个数+1】【3】
        //row col val
        int[][] sparseArr = new int[sum+1][3];
        //第一行:原始数组行数、原始数组列数、原始数组有效数值个数
        sparseArr[0][0] = chessArr.length;
        sparseArr[0][1] = chessArr[0].length;   //都一样,取其一即可
        sparseArr[0][2] = sum;

        //5、将有效数值装入稀疏数组
        int count = 0;  //计数
        for (int i = 0; i < chessArr.length; i++) {
            for (int j = 0; j < chessArr[i].length; j++) {
                if (chessArr[i][j]!=0){
                    count++;
                    sparseArr[count][0] = i;
                    sparseArr[count][1] = j;
                    sparseArr[count][2] = chessArr[i][j];
                }
            }
        }

        //6、还原原始数组
        int[][] chessArr2 = new int[sparseArr[0][0]][sparseArr[0][1]];
        for (int i = 1; i < sparseArr.length; i++) {
            chessArr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
        }
    }
}
  1. 效果展示
    在这里插入图片描述

  2. 增加需求
    在这里插入图片描述

  3. 代码实现

import java.io.*;

public class SparseArray {
    public static void main(String[] args) throws Exception{

        //1、11*11的原始棋盘,0为无效数据,1为黑子,2为蓝子
        int[][] chessArr = new int[11][11];

        //2、设置原始棋盘的有效棋子位置
        chessArr[1][1] = 1; //第二列第二行有个黑子
        chessArr[2][2] = 2; //第三列第三行有个蓝子

        //3、获取有效数值个数
        int sum = 0;
        for (int i = 0; i < chessArr.length; i++) {
            for (int j = 0; j < chessArr[i].length; j++) {
                if (chessArr[i][j]!=0){
                    sum++;
                }
            }
        }

        //4、初始化稀疏数组【有效数组个数+1】【3】
        //row col val
        int[][] sparseArr = new int[sum+1][3];
        //第一行:原始数组行数、原始数组列数、原始数组有效数值个数
        sparseArr[0][0] = chessArr.length;
        sparseArr[0][1] = chessArr[0].length;   //都一样,取其一即可
        sparseArr[0][2] = sum;

        //5、将有效数值装入稀疏数组
        int count = 0;  //样式
        for (int i = 0; i < chessArr.length; i++) {
            for (int j = 0; j < chessArr[i].length; j++) {
                if (chessArr[i][j]!=0){
                    count++;
                    sparseArr[count][0] = i;
                    sparseArr[count][1] = j;
                    sparseArr[count][2] = chessArr[i][j];
                }
            }
        }

        //6、读取到磁盘中
        //获取文件对象
        File file = new File("E:\\map.data");
        //文件写入流
        FileWriter writer = new FileWriter(file);
        //遍历数组,写入文件
        for (int[] sparse:sparseArr) {
            for (int s:sparse) {
                writer.write(s+"\t");
            }
            writer.write("\n");
        }
        writer.close();

        //7、还原原始数组
        //从磁盘中读取数据
        BufferedReader reader = new BufferedReader(new FileReader(file));
        String line = "";
        int[][] chessArr2 = null;
        int row = 0;

        //循环读取文件的每一行数据
        while ((line=reader.readLine())!=null){
            //按tab位切割成字符串数组,再转为int数组
            String[] temp = line.split("\t");
            int[] ints = new int[temp.length];
            for (int i = 0; i < ints.length; i++) {
                ints[i] = Integer.parseInt(temp[i]);
            }
            row++;
            //文件第一行,即稀疏数组的第一行数组,为原始数组的长宽数量
            if (row==1){
                chessArr2 = new int[ints[0]][ints[1]];
            }else{
                //余下添加即可,没有赋值的地方,数组会初始化为0
                chessArr2[ints[0]][ints[1]] = ints[2];
            }
        }
        reader.close();
    }
}
  1. 效果展示
    在这里插入图片描述
    在这里插入图片描述
  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值