1数据结构之稀疏数组

在这里插入图片描述
上面的原来的二维数组有许多的0值或者为同一个值的时候,记录了许多没有意义的数据,因此可以用稀疏数组来保存该数组,可以缩小规模
原本是6行7列的二维数组,现在变成9行3列的稀疏数组。

代码如下:
将二维数组转为稀疏数组

public class Test01 {
    public static void main(String[] args) {
        //首先声明一个原有的二维数组并输出
        int array [][] = new int[11][11];
        //0 1 2
        array[1][2]=1;
        array[2][3]=2;
        for (int i=0;i<array.length;i++){
            for (int j=0;j<array[i].length;j++){
                System.out.print("   "+array[i][j]);
            }
            System.out.println();
        }
        //2.遍历原有数组 得出非零数字的个数
        int nums=0;
        for (int i=0;i<array.length;i++){
            for (int j=0;j<array[i].length;j++){
                if (array[i][j]!=0) {
                    nums++;
                }
            }
        }
        //输出为2
        System.out.println(nums);

        //3.创建稀疏数组  稀疏数组的列是固定的3列   又因为只有两个值不为零 所以有三行
        int sparseArray[][] = new int[nums+1][3];
        //下面是稀疏数组的第一行对应的值
        sparseArray[0][0]=array.length;
        sparseArray[0][1]=11;
        sparseArray[0][2]=nums;

        //现在需要做的是将二维数组的非零值放在稀疏数组里面
        //再次遍历二维数组 当遍历的时候出现非零值 比如【2】【3】
        //原来在第二行和第三列有值 那么稀疏数组的行值就是 2 列的值就是3 最后的值就是非零值

        //该行有值 就是下一行 count记录第几个非零数字
        int count =0;
        for (int i=0;i<array.length;i++){
            for (int j=0;j<array[i].length;j++){
                if (array[i][j]!=0) {
                    count++;
                  sparseArray[count][0]=i;
                  sparseArray[count][1]=j;
                  sparseArray[count][2]=array[i][j];
                }
            }
        }
        //输出稀疏数组
        for (int i=0;i<sparseArray.length;i++){
            for (int j=0;j<sparseArray[i].length;j++){
                System.out.print("   "+sparseArray[i][j]);
            }
            System.out.println();
        }
    }
}

输出结果:
在这里插入图片描述
稀疏数组转化为原有的二维数组:
在这里插入图片描述
结果如下:
在这里插入图片描述

课后练习题:

1.将稀疏数组保存在磁盘上,比如map.data
2.再从磁盘上把稀疏数组读出来转化成原数组

代码:

package com.zy;

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class Test02 {
    public static void main(String[] args) throws IOException {
        System.out.println("原有的二维数组如下:");
        //首先声明一个原有的二维数组并输出
        int array [][] = new int[11][11];
        //0 1 2
        array[1][2]=1;
        array[2][3]=2;
        for (int i=0;i<array.length;i++){
            for (int j=0;j<array[i].length;j++){
                System.out.print("   "+array[i][j]);
            }
            System.out.println();
        }

        System.out.println("原有数组非零值如下:");
        //2.遍历原有数组 得出非零数字的个数
        int nums=0;
        for (int i=0;i<array.length;i++){
            for (int j=0;j<array[i].length;j++){
                if (array[i][j]!=0) {
                    nums++;
                }
            }
        }
        //输出为2
        System.out.println(nums);

        System.out.println("原有的二维数组转为稀疏数组结果如下:");

        //3.创建稀疏数组  稀疏数组的列是固定的3列   又因为只有两个值不为零 所以有三行
        int sparseArray[][] = new int[nums+1][3];
        //下面是稀疏数组的第一行对应的值
        sparseArray[0][0]=array.length;
        sparseArray[0][1]=11;
        sparseArray[0][2]=nums;

        //现在需要做的是将二维数组的非零值放在稀疏数组里面
        //再次遍历二维数组 当遍历的时候出现非零值 比如【2】【3】
        //原来在第二行和第三列有值 那么稀疏数组的行值就是 2 列的值就是3 最后的值就是非零值

        //该行有值 就是下一行 count记录第几个非零数字
        int count =0;
        for (int i=0;i<array.length;i++){
            for (int j=0;j<array[i].length;j++){
                if (array[i][j]!=0) {
                    count++;
                    sparseArray[count][0]=i;
                    sparseArray[count][1]=j;
                    sparseArray[count][2]=array[i][j];
                }
            }
        }
        //输出稀疏数组
        for (int i=0;i<sparseArray.length;i++){
            for (int j=0;j<sparseArray[i].length;j++){
                System.out.print("   "+sparseArray[i][j]);
            }
            System.out.println();
        }

        FileWriter fw = new FileWriter("D:\\map.data");
        for (int[] row : sparseArray){
            for (int data : row ){
                fw.write(data);
            }
        }
        fw.close();

        // 3. 从map.data中读取该稀疏数组
        // 3.1 先造个稀疏数组
        int[][] mapSparseArray2 = new int[nums+1][3];

        // 3.2 将map.data中数据读入mapSparseArray2中
        FileReader fr = new FileReader("D:\\map.data");
        for (int i = 0; i < nums+1; i++){
            for (int j = 0; j < 3; j++){
                int num = fr.read();
                mapSparseArray2[i][j] = num;
            }
        }
        fr.close();
        System.out.println("稀疏数组转化为原有的二维数组");
        //1.首先 稀疏数组的【0】【0】和【0】【1】是原有数组的行和列的个数
        int array2[][] = new int[mapSparseArray2[0][0]][mapSparseArray2[0][1]];

        //2.稀疏数组里面的值都是有值的,没有0值 现在对二维数组进行赋值
        //因为第一行定义的是原有数组的行数和列数 所以值从第二行开始 也就是1 int i=1开始;
        for (int i=1;i<mapSparseArray2.length;i++){

            array2[mapSparseArray2[i][0]][mapSparseArray2[i][1]]=mapSparseArray2[i][2];
        }
        //输出恢复后的二维数组
        for (int i=0;i<array2.length;i++){
            for (int j=0;j<array2[i].length;j++){
                System.out.print("   "+array2[i][j]);
            }

            System.out.println();
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值