稀疏数组思路总结

稀疏数组

  • 需求:编写的五子棋程序中,有存盘和续上盘的功能,即使用稀疏数组存储棋盘,再恢复

  • 思路:

    对于二维数组中有大量相同的数字,例如棋盘中大量没有下的棋子设为0,黑子设为1,白子设为2,建立一个稀疏数组,只保存黑子,白子的位置以及二维数组的大小

    rowcolumnvalue
    二维数组的行二维数组的列有多少个非零数组
    行号列号1(表示黑子)
    行号列号2(白子)
    棋子在二维数组的行的位置棋子在二维数组的行的位置。。。(黑/白)
  • 优势:11*11=121的二维数组,比如有20个棋子,只需大小为(20+1)* 3 = 63的数组

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

public class ParseArray {
    static int[][] chessArr;
    static int[][] sparseArr;

    public static void main(String[] args) {
        // 棋盘原数据
        chessArr = new int[11][11];
        chessArr[0][0] = 1;
        chessArr[3][4] = 2;
        chessArr[5][9] = 2;
        printArray(chessArr);

        // 棋盘数组转化为稀疏数组,遍历数组统计有多少个非零项,以及位置
        // 储存为行,列,值
        int sum = 0;
        int row = chessArr.length;
        int colunm = chessArr[0].length;
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < colunm; j++) {
                if (chessArr[i][j] != 0) {
                    sum++;
                }
            }
        }
        // 稀疏数组
        sparseArr = new int[sum + 1][3];
        // 第一行是原棋盘的数据
        sparseArr[0][0] = row;
        sparseArr[0][1] = colunm;
        sparseArr[0][2] = sum;

        // 将棋子储存进sparse中,遍历二维数组
        int count = 1;  // 计算稀疏数组已经存储了多少数据
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < colunm; j++) {
                if (chessArr[i][j] != 0) {
                    sparseArr[count][0] = i;
                    sparseArr[count][1] = j;
                    sparseArr[count][2] = chessArr[i][j];
                    count++;
                }
            }
        }
        // 打印稀疏数组
        printArray(sparseArr);

        // 稀疏数组转化为棋盘数据
        int[][] chessArr2 = convertChess(sparseArr);
        printArray(chessArr2);

        // 写入文件
        writeSparse2File();
        int[][] sparseArr2 = readSparseFile("sparseArray.data");
        printArray(sparseArr2);
    }

    private static int[][] convertChess(int[][] sparseArr) {
        int[][] chess = new int[sparseArr[0][0]][sparseArr[0][1]];
        int sum = sparseArr[0][2];
        // 从第二行遍历稀疏列表,读取内容还原棋盘非零数据
        for (int i = 1; i < sum + 1; i++) {
            int r = sparseArr[i][0];
            int c = sparseArr[i][1];
            int value = sparseArr[i][2];
            chess[r][c] = value;
        }
        return chess;
    }

    private static void printArray(int[][] array) {
        int row = array.length;
        int colum = array[0].length;
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < colum; j++) {
                System.out.print(array[i][j] + "\t");
            }
            System.out.println();
        }
    }

    private static int[][] readSparseFile(String path){
        try(BufferedReader reader = new BufferedReader(new FileReader(path))){
            // 读取第一行,创建稀疏数组
            String firstline = reader.readLine();
            int[] row1 = parseStr(firstline);
            int sum = row1[2];
            int[][] parseArray = new int[sum+1][3];
            parseArray[0] = row1;
            for (int i = 1; i < sum+1; i++) {
                String rowStr = reader.readLine();
                parseArray[i] = parseStr(rowStr);
            }
            return parseArray;
        }catch (Exception e){
        }
        return null;
    }
    private static int[] parseStr(String str){
        int strlength = str.length();
        str = str.substring(1, strlength-1);
        String[] split_str = str.split(", ");
        int len = split_str.length;
        int[] row = new int[len];
        for (int i = 0; i < len; i++) {
            row[i] = Integer.parseInt(split_str[i]);
        }
        return row;
    }
    private static void writeSparse2File() {
        BufferedWriter writer = null;
        int sum = sparseArr[0][2];
        try {
            writer = new BufferedWriter(new FileWriter("sparseArray.data"));
            for (int i = 0; i < sum + 1; i++) {
                int[] row = sparseArr[i];
                String Arrstr = Arrays.toString(row);
                writer.write(Arrstr);
                writer.write("\r\n");
                writer.flush();
            }
        } catch (Exception e) {
        } finally {
            try {
                if (writer != null) {
                    writer.close();
                }
            } catch (Exception e) {}
        }
    }
}
稀疏数组:
11	11	3	
0	0	1	
3	4	2	
5	9	2
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值