Java数据结构---稀疏数组写入读出文件

文章目录


基本介绍

当一个数组中大部分元素为0,或者为同一个值的时候,可以使用稀疏数组来保存该数组以节省空间.
处理方法:

1:记录源数组的行数列数与值(不重复)的数目
2:把这些值放在一个x行3列的二维数组中存储(x为有效值数+1)

如下图就是一个重复元素较多的数组,因此外面可以考虑采用稀疏数组的方式存储该数组
Java数据结构---稀疏数组写入读出文件
下图就是转换后的稀疏数组,其中第一行第一列代表源数组行数,第一行第二列代表源数组列数,第一行第三列代表源数组有效值个数.
之后的每一行的第一列代表有效值所在的行对应的数组索引,第二列代表有效值所在的列对应的数组索引,第三列代表对应的值
Java数据结构---稀疏数组写入读出文件

一、代码

package algorithm.DataStruct.Array;

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

/**
 * @author: Serendipity
 * Date: 2022/1/25 10:52
 * Description:稀疏数组 x行3列(x为源数组数据个数+1)
 * arrays[0][0]=行数  arrays[0][1]=列数 arrays[0][2]=值数
 * 第一列:源数据所在行
 * 第二列:源数据所在列
 * 第三列:源数据所在值
 * 最后需要了解如何将数组写入并读出文件
 */
public class SparseArray {
    private int row;
    private int col;
    private int val;

    public SparseArray() {
    }
    public SparseArray(int row, int col, int val) {
        this.row = row;
        this.col = col;
        this.val = val;
    }

    public int getRow() {
        return row;
    }

    public void setRow(int row) {
        this.row = row;
    }

    public int getCol() {
        return col;
    }

    public void setCol(int col) {
        this.col = col;
    }

    public int getVal() {
        return val;
    }

    public void setVal(int val) {
        this.val = val;
    }

    public static void main(String[] args) {
        final int ROW=5;final int COL=5;
        int[][]chess=new int[ROW][COL];int sum=0;
        SparseArray[]spareArr=new SparseArray[(int)Math.sqrt(chess.length)];
        chess[1][2]=1;chess[2][3]=1;
        for(int i=0;i<chess.length;i++){  //显示棋盘
            for (int j = 0; j < chess[i].length; j++) {
                System.out.printf("%5d",chess[i][j]);
                if(chess[i][j]!=0){
                    spareArr[sum++]=new SparseArray(i,j,chess[i][j]);
                }
            }
            System.out.println();
        }
        int[][]sparseArray=new int[sum+1][3];
        sparseArray[0][0]=chess.length;sparseArray[0][1]=chess[0].length;sparseArray[0][2]=sum;
        for(int i=1;i<sparseArray.length;i++){
           sparseArray[i][0]=spareArr[i-1].getRow();
           sparseArray[i][1]=spareArr[i-1].getCol();
           sparseArray[i][2]=spareArr[i-1].getVal();
        }
//        System.out.println(Arrays.deepToString(sparseArray));
        try(FileWriter fw=new FileWriter(new File("D:\\desktopfile\\file.txt"))) {
            for(int i=0;i<sparseArray.length;i++){
                for (int j=0;j<sparseArray[0].length;j++){
                    fw.write(sparseArray[i][j]+"\t");
                }
                fw.write("\r\n");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        String line;int[][]temp=null;
        try(BufferedReader br=new BufferedReader(
                new FileReader(new File("D:\\desktopfile\\file.txt")))){
            while((line=br.readLine())!=null) {
                String[] split = line.split("\t"); //这个数组就3个元素
                if(temp==null){
                    temp=new int[Integer.parseInt(split[0])][Integer.parseInt(split[1])];
                }else {
                    temp[Integer.parseInt(split[0])][Integer.parseInt(split[1])]
                            = Integer.parseInt(split[2]);
                }
            }
            System.out.println(Arrays.deepToString(temp)); //二维数组就应该使用这个方法

        }catch (IOException e){
            e.printStackTrace();
        }
    }
}

二、效果演示

Java数据结构---稀疏数组写入读出文件
Java数据结构---稀疏数组写入读出文件

上一篇:Numpy 系列(九)- 结构化数组


下一篇:codeforces590b//Chip 'n Dale Rescue Rangers//Codeforces Round #327 (Div. 1)