稀疏数组的实现

原理
对于一些比较大的二维数组,其中有很多的位置为零,也就是无效的数据,我们在保存的时候只需要保存数组有数据的位置即可,这就是稀疏数组。
稀疏数组的第一行第0列是二维矩阵的行数,第1列是二维矩阵的列数,第2列是二维矩阵中的有效数据个数
在后几行的第0列是有效数据的行坐标,第1列是列坐标,第2列是有效数据的数值。
之后我们将稀疏数组保存到文件中,这样就比直接保存二维数组更加节省空间。
从文件中读取出稀疏数组,先读取第一行,创建出二维矩阵,之后遍历将有效数据存入二维数组,实现了从稀疏数组恢复为二维数组。

package sparseArray;

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

/**
 * 稀疏数组
 */
public class SparseArray {
    public static void main(String[] args) throws IOException {
        //创建一个11*11的二维数组
        //0表示没有棋子,1表示黑子,2表示白子
        int chessArray01[][] = new int[11][11];
        chessArray01[1][2] = 1;
        chessArray01[2][3] = 2;
        chessArray01[5][6] = 1;
        //原始的二维数组
        System.out.println("原始的二维数组为:");
        for (int[] row:chessArray01){
            for (int data :row){
                System.out.printf("%d\t",data);
            }
            System.out.println();
        }
        //将二维数组转为稀疏数组的思路

        //先遍历二维数组,得到非零数据的个数
        int sum = 0;
        for (int i = 0; i < chessArray01.length; i++) {
            for (int j = 0; j < chessArray01[0].length; j++) {
                if (chessArray01[i][j]!=0){
                    sum++;
                }
            }
        }
        //创建稀疏数组
        int sparseArray[][] = new int[sum+1][3];
        //给稀疏数组赋值
        sparseArray[0][0] = 11;
        sparseArray[0][1] = 11;
        sparseArray[0][2] = sum;
        //遍历二维数组,将非零的值存放到稀疏数组
        int count = 0;//count用来记录是第几个非零数据
        for (int i = 0; i < chessArray01.length; i++) {
            for (int j = 0; j < chessArray01[0].length; j++) {
                if (chessArray01[i][j]!=0){
                    count++;//记录一次非零数据
                    sparseArray[count][0] = i;
                    sparseArray[count][1] = j;
                    sparseArray[count][2] = chessArray01[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]);
        }
        //将得到的稀疏数组保存到文件map.data中
        File file = new File("map.data");
        FileWriter out = new FileWriter(file);
        for (int i = 0; i <sparseArray.length ; i++) {
            out.write(sparseArray[i][0]+"\t"+sparseArray[i][1]+"\t"+sparseArray[i][2]+"\n");
        }
        out.close();
        //从文件中读取稀疏数组
        BufferedReader in = new BufferedReader(new FileReader(file));
        //定义新的稀疏数组
        String line;//一行数据
        int rowCount = 0;
        int [][] sparseArray02 = {};
        //读取第一行数据
        while ((line = in.readLine())!=null){
            if (rowCount==0){
                String[] str = line.split("\t");
                sparseArray02 = new int[Integer.parseInt(str[2])+1][3];
                sparseArray02[rowCount][0] = Integer.parseInt(str[0]);
                sparseArray02[rowCount][1] = Integer.parseInt(str[1]);
                sparseArray02[rowCount][2] = Integer.parseInt(str[2]);
                rowCount++;
            }else {
                String[] str = line.split("\t");
                sparseArray02[rowCount][0] = Integer.parseInt(str[0]);
                sparseArray02[rowCount][1] = Integer.parseInt(str[1]);
                sparseArray02[rowCount][2] = Integer.parseInt(str[2]);
                rowCount++;
            }
        };
        //输出从文件中读取的稀疏数组
        System.out.println("从文件中读取的稀疏数组为:");
        for (int i = 0; i <sparseArray02.length ; i++) {
            System.out.printf("%d\t%d\t%d\t\n",sparseArray02[i][0],sparseArray02[i][1],sparseArray02[i][2]);
        }

        //将稀疏数组恢复成二维数组
        //根据稀疏数组的第一行创建二维数组
        int chessArray02[][] = new int[sparseArray02[0][0]][sparseArray02[0][1]];
        //循环稀疏数组的后几行,给二维数组赋值
        for (int i = 1; i <sparseArray02.length ; i++) {
            chessArray02[sparseArray02[i][0]][sparseArray02[i][1]] = sparseArray02[i][2];
        }
        //输出恢复后的二维数组
        System.out.println("恢复后的二维数组为:");
        for (int[] row:chessArray02){
            for (int data :row){
                System.out.printf("%d\t",data);
            }
            System.out.println();
        }

    }
}

posted @ 2021-04-10 19:21  夜月薇凉映银弩  阅读(42)  评论(0编辑  收藏  举报