算法-稀疏矩阵练习题

题目

将一个稀疏数组保存到磁盘上,命名为map.data。
再从磁盘读取map.data中的稀疏数组,将其恢复成原始的二维数组。

代码

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

public class Test01 {
    public static void main(String[] args) {
        //1.生成二维数组
        int[][] a1 = new int[10][10];
        a1[1][2] = 2;
        a1[2][4] = 1;
        //2.打印原始二维数据
        System.out.println("原始的二维数组如下:");
        for(int[] arr : a1) {
            for (int num : arr) {
                System.out.printf("%d\t", num); //注意此处!
            }
            System.out.println();
        }
        //3.先遍历二维数据,得到非零数据的个数
        int sum = 0;
        for(int i = 0; i < 10; i++){
            for(int j = 0; j < 10; j++){
                if(a1[i][j]!=0){
                    sum++;
                }
            }
        }
        //4.创建对应的稀疏矩阵
        int [][] a2 = new int[sum+1][3];
        a2[0][0] = 10;
        a2[0][1] = 10;
        a2[0][2] = sum;
        //5.遍历二维数组,将非零的值存放到稀疏矩阵a2中
        int count = 0; //记录第几个数据
        for(int i = 0; i < 10; i++){
            for(int j = 0; j < 10; j++){
                if(a1[i][j]!=0){
                    count++;
                    a2[count][0] = i;
                    a2[count][1] = j;
                    a2[count][2] = a1[i][j];
                }
            }
        }
        //6.输出对应的稀疏矩阵
        System.out.println("对应的稀疏矩阵如下:");
        for(int[] arr : a2) {
            for (int num : arr) {
                System.out.printf("%d\t", num); //注意此处!
            }
            System.out.println();
        }
        //7.将稀疏数组写入文件中,文件名为map.data
        File file = new File("e:\\map.data");
        FileWriter writer = null;
        try {
            //转换流
            writer = new FileWriter(file);
            for (int i = 0; i < a2.length; i++) {
                writer.append(a2[i][0]+"\t"+a2[i][1]+"\t"+a2[i][2]+"\n");
            }
            System.out.println("写入成功");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                writer.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        //7.从磁盘上读取map.data中的稀疏数组
        List<String> lists =new ArrayList<>();
        int[][] a3;
        try {
            FileReader reader = new FileReader(file);
            BufferedReader bufferedReader = new BufferedReader(reader);
            //按行读取数据再分割
            String line;
            while((line = bufferedReader.readLine()) != null){
                lists.add(line);
            }
            String[] contents = lists.get(0).split("\t");
            a3 =new int[Integer.parseInt(contents[2])+1][3];
            a3[0][0] = Integer.parseInt(contents[0]);
            a3[0][1] = Integer.parseInt(contents[1]);
            a3[0][2] = Integer.parseInt(contents[2]);
            for (int i = 1; i < lists.size(); i++) {
                contents = (lists.get(i)).split("\t");
                a3[i][0] = Integer.parseInt(contents[0]);
                a3[i][1] = Integer.parseInt(contents[1]);
                a3[i][2] = Integer.parseInt(contents[2]);
            }
            //8.输出读取的稀疏矩阵
            System.out.println("从磁盘中读取的稀疏矩阵:");
            for(int[] arr : a3) {
                for (int num : arr) {
                    System.out.printf("%d\t", num);
                }
                System.out.println();
            }
            //9.将稀疏矩阵恢复成原始的二维数组
            int[][] a4 = new int[a3[0][0]][a3[0][1]];
            for(int i = 1; i<a3.length;i++){
                a4[a3[i][0]][a3[i][1]] = a3[i][2];
            }
            System.out.println("恢复后的二维数组:");
            for(int[] arr : a4) {
                for (int num : arr) {
                    System.out.printf("%d\t", num);
                }
                System.out.println();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

看到网上的另一种解法:

while (reader.ready()) {
    sb.append((char) reader.read());// 转成char加到StringBuffer对象中
}
System.out.println(sb.toString());  //将StringBuffer -> String输出
//split("\\s+") 按空格,制表符,等进行拆分
//也就是说它是按空白部分进行拆分,不管这个空白是什么,例如空格键 tab键
String[] str =sb.toString().split("\\s+");
int count = 0;
//str.length/3 理解:一行三个元素,算出有多少行
int[][] spareArray = new int[str.length/3 ][3];
for (String s : str) {
    // [(count - (count % 3)) / 3] 的值为 0 0 0 1 1 1 ···
    // [count % 3] ->在0-2之间循环
    spareArray[(count - (count % 3)) / 3][count % 3] = Integer.parseInt(s);
        count ++;
    }
return spareArray;

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值