稀疏数组本地读写版代码实现

Posted 庸人冲

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了稀疏数组本地读写版代码实现相关的知识,希望对你有一定的参考价值。

最近开始肝数据结构了,老韩布置了作业让把代码改成可以写入和读取本地文件的版本,刚好前几天才学完JavaSE,想着soeasy,结果各种报错乱码写不全,又滚回去复习了一遍…,在网上也搜了下相关的解决方法,整合了下,写了个自己的版本,都差不多。

package demo01;
import org.junit.jupiter.api.Test;
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;

public class SparseArrWithFileTest {

    @Test
    public void test1() throws IOException {


        // 一、 将原二维数组转换为稀疏数组

        // 1. 创建二维数组, 条件为11行11列
        int[][] chessArr1 = new int[11][11];
        // 赋值: 0: 代表空, 1: 代表白棋子 2: 代码黑棋子
        chessArr1[0][6] = 1;
        chessArr1[1][3] = 1;
        chessArr1[4][7] = 1;
        chessArr1[3][5] = 2;
        chessArr1[8][9] = 2;

        // 2. 获取二维数组有效数(非零)的个数, 并遍历输出
        int totalNum = 0;
        for (int[] row : chessArr1) {
            for (int item : row) {
                if (item != 0) totalNum++;
                System.out.print(item + "\\t");
            }
            System.out.println();
        }

        // 3. 创建稀疏数组
        // 稀疏数组的行数为: totalNum + 1, 第一行用于保存原二维数组的信息
        // 稀疏数组的列数为: 3, 第一列保存行信息, 第二列保存列信息, 第三列保存值信息
        int[][] sparseArr = new int[totalNum + 1][3];
        // 将原二位数组的信息保存在第一行
        sparseArr[0][0] = chessArr1.length;      // 保存原二维数组的行数
        sparseArr[0][1] = chessArr1[0].length;   // 保存原二维数组的列数
        sparseArr[0][2] = totalNum;              // 保存有效数的个数

        // 4. 将有效数存入稀疏数组中
        int count = 0;  // 用于纪录稀疏数组的行数
        for (int i = 0; i < chessArr1.length; i++) {
            for (int j = 0; j < chessArr1[i].length; j++) {
                if (chessArr1[i][j] != 0) {  // 找到不为0的有效数
                    count++;  // 从稀疏数组第二行(下标为1)开始存储
                    sparseArr[count][0] = i;  // 保存有效数的行下标
                    sparseArr[count][1] = j;  // 保存有效数的列下标
                    sparseArr[count][2] = chessArr1[i][j];  // 保存有效数
                }
                if (count == totalNum) break;
            }
            if (count == totalNum) break;
        }

        // 输出
        printArr(sparseArr);

        // 5. 将稀疏数组的信息写入到本地文件中
        String path = "data.txt";
        fileWrite(path,sparseArr);


        // 二、 将稀疏数组转为二维数组:

        // 1. 从本地读取存放的稀疏数组
        int[][] newSparseArr = fileRead(path);
        printArr(newSparseArr);

        // 2. 创建新的二维数组
        // 行数为稀疏数组下标(0,0)的值, 即保存的原二维数组的行数
        // 列数为稀疏数组下标(0,1)的值, 即保存的原二维数组的列数
        int[][] chessArr2 = new int[newSparseArr[0][0]][newSparseArr[0][1]];

        // 3. 通过稀疏数组中前两列的值找到有效数对应的下标, 并将第三列的值存放在该位置中
        for(int i = 1; i < newSparseArr.length;i++){ // 从第二行(行下标为1)开始遍历
            chessArr2[newSparseArr[i][0]][newSparseArr[i][1]] = newSparseArr[i][2];
        }
        printArr(chessArr2);
    }

    /**
     * 打印二维数组
     * @param arr 需要打印的二维数组
     */
    public void printArr(int[][] arr){
        for(int[] row: arr){
            for(int item : row){
                System.out.print(item + "\\t");
            }
            System.out.println();
        }
    }


    /**
     *  从本地文件读取稀疏数组
     * @param filePath 文件路径
     * @return 返回通过读取数据创建的新稀疏数组
     * @throws IOException
     */
    public int[][] fileRead(String filePath) throws IOException {
        // 获取文件每一行组成的集合
        List<String> list = Files.readAllLines(Paths.get(filePath));
        // 通过list的长度, 即行数创建新的稀疏数组
        int[][] newSparseArr = new int[list.size()][3];
        // 遍历赋值
        for(int i = 0; i < list.size();i++){
            // 将list中每一行的字符串, 以"\\t"分割为字符串数组
            String[] split = list.get(i).split("\\t");
            for(int j = 0; j < split.length;j++){
                // 将数组中的每个元素转换为Integer类型, 并赋值给新的稀疏数组
                newSparseArr[i][j] = Integer.parseInt(split[j]);
            }
        }
        // 返回新创建的稀疏数组
        return newSparseArr;
    }


    /**
     *  将稀疏数组写入本地文件中,把数组中每个元素作为字符串添加至本地文件
     * @param filePath
     * @param sparseArr 稀疏数组
     */
    public void fileWrite(String filePath ,int sparseArr[][])  {
        FileWriter fw = null;
        try {
            // 创建指定路径的File类对象
            File file = new File(filePath);
            // 创建字符节点流
            fw = new FileWriter(file);
            // 遍历
            for(int[] row:sparseArr){
                for(int item:row){
                    fw.write(item + "\\t"); // 将每个数组中每个元素作为字符串添加至本地文件
                }
                // 换行
                fw.write("\\n");
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(fw != null){
                try {
                    // 关闭流资源, 因为需要关闭资源,所以不建议throws异常, 而是直接在本方法内处理掉异常
                    fw.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

以上是关于稀疏数组本地读写版代码实现的主要内容,如果未能解决你的问题,请参考以下文章

数据结构稀疏数组 --- 应用场景,转换的思路分析,代码实现

对数组中的字符串进行排序,使其稀疏

Java数据结构—稀疏数组

稀疏数组的基本实现

稀疏数组的基本实现

[DataStructure]线性数据结构之稀疏数组链表栈和队列 Java 代码实现