java 稀疏矩阵小作业

将稀疏数组保存到磁盘上,文件名map.data 读取map.data恢复稀疏数组

PS: 这是韩顺平老师(Java数据结构与java算法)布置的一道小作业

package sparsearray;

import java.io.*;
import java.util.ArrayList;
import java.util.List;

public class SparseArray {
    public static void main(String[] args) {
        /*
         * chessArray1 表示原始数组:11*11
         * 0:表示没有棋子; 1:表示有黑色棋子; 2表示有蓝色棋子
         * */
        int[][] chessArray1 = new int[11][11];
        chessArray1[1][2] = 1;
        chessArray1[2][3] = 2;
        chessArray1[4][5] = 2;
        int sum = 0;

        //输出原始数组
        System.out.println("原始矩阵");
        sum = toChessArray(chessArray1);

        //将二维数组转换为稀疏矩阵
        int[][] spareArray = new int[sum+1][3];
        spareArray[0][0] = chessArray1.length;
        spareArray[0][1] = chessArray1[0].length;
        spareArray[0][2] = sum;
        int count = 0;
        for (int i = 0; i < chessArray1.length; i++)
            for (int j = 0; j < chessArray1[0].length; j++)
                if(chessArray1[i][j] != 0){
                    count ++;
                    spareArray[count][0] = i;
                    spareArray[count][1] = j;
                    spareArray[count][2] = chessArray1[i][j];
                }

        dumpToDestop(spareArray); //将稀疏数组保存在磁盘中
        spareArray = readFromDisk2();

        //输出稀疏矩阵
        System.out.println("稀疏矩阵:");
        for (int[] row : spareArray) {
            for (int data : row) {
                System.out.printf("%d\t",data);
            }
            System.out.println();
        }

        //稀疏矩阵转换为二维矩阵
        int[][] chessArray2 = new int[spareArray[0][0]][spareArray[0][1]];
        for (int i = 1; i < spareArray.length; i++) {
            chessArray2[spareArray[i][0]][spareArray[i][1]] = spareArray[i][2];
        }

        //输出 稀疏矩阵转换为二维矩阵 的值
        System.out.println("原始矩阵");
        toChessArray(chessArray2);
    }

    public static int toChessArray(int[][] chessArray){
        int sum = 0;
        for (int[] row : chessArray) {
            for (int data : row) {
                System.out.printf("%d ",data);
                if(data != 0){
                    sum ++;
                }
            }
            System.out.println();
        }
        return sum;
    }
    public static void dumpToDestop(int[][] sparseArray){
        try {
            File file = new File("map.data");
            FileOutputStream fileOutputStream = new FileOutputStream(file);
            OutputStreamWriter writer = new OutputStreamWriter(fileOutputStream,"UTF-8");
            for (int i = 0; i < sparseArray.length; i++) {
                writer.append(sparseArray[i][0]+"\t"+sparseArray[i][1]+"\t"+sparseArray[i][2]+"\n");
            }
            writer.close();
            fileOutputStream.close();
            
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
    //方法一:
    public static int[][] readFromDisk(){
        List<String> lists =new ArrayList<>();
        int[][] spareArray;
        try {
            File file = new File("map.data");
            InputStreamReader reader = new InputStreamReader(new FileInputStream(file),"UTF-8");
            BufferedReader bufferedReader = new BufferedReader(reader);
            String line = null;
            int count =0;       //当前数组所在的列数
            while((line = bufferedReader.readLine()) != null){
                lists.add(line);
            }
            String[] contents = new String(lists.get(0)).split("\t");
            spareArray =new int[Integer.parseInt(contents[2])+1][Integer.parseInt(contents[2])];
            spareArray[0][0] = Integer.parseInt(contents[0]);
            spareArray[0][1] = Integer.parseInt(contents[1]);
            spareArray[0][2] = Integer.parseInt(contents[2]);

            for (int i = 1; i < lists.size(); i++) {
                contents = new String(lists.get(i)).split("\t");
                spareArray[i][0] = Integer.parseInt(contents[0]);
                spareArray[i][1] = Integer.parseInt(contents[1]);
                spareArray[i][2] = Integer.parseInt(contents[2]);
            }
            return spareArray;
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }
		//方法二
    public static int[][] readFromDisk2(){
        try {
            File file =new File("map.data");
            FileInputStream fis = new FileInputStream(file);

            InputStreamReader reader = new InputStreamReader(fis, "UTF-8");
            StringBuffer sb = new StringBuffer();
            while (reader.ready()) {
                sb.append((char) reader.read());// 转成char加到StringBuffer对象中
            }
            System.out.println(sb.toString());
            String[] str =sb.toString().split("\\s+");
            int count = 0;
            int[][] spareArray = new int[str.length/3 ][3];
            for (String s : str) {
                spareArray[(count - (count % 3)) / 3][count % 3] = Integer.parseInt(s);
                //参考:https://blog.youkuaiyun.com/qq_43270712/article/details/103391008
                count ++;
            }
            return spareArray;
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值