稀疏数组的创建和还原

本文介绍了如何创建、输出、还原稀疏数组。稀疏数组用于存储大量0值的二维数组,以节省空间。首先展示了如何初始化一个包含1和2的二维数组arr1,接着将其转换为稀疏数组arr2,记录非0元素的位置和值。在稀疏数组中,第一行存储矩阵的规模和非0元素个数。最后,演示了如何从稀疏数组arr2还原回原始二维数组arr3。整个过程体现了稀疏数组在处理大量0值场景下的效率优势。
摘要由CSDN通过智能技术生成

已有条件

arr1,值只能为0,1,2

下面为创建arr1和输出arr1

int[][] arr1=new int[11][11];
        arr1[1][2]=1;
        arr1[2][3]=2;
        for (int[] ints : arr1) {
            for (int anInt : ints) {
                System.out.print(anInt+" ");
            }
            System.out.println();
        }

创建稀疏数组

arr2,表示的方法

第一行是表示行列的规模,与arr1的值没有关系

在这里插入图片描述

//遍历二维数组进行将arr1里的非0的值存放在arr2
        int count=0;
        for (int i = 0; i < arr1.length; i++) {
            for (int j = 0; j < arr1[i].length; j++) {
                if(arr1[i][j]!=0){
                    count++;
                    arr2[count][0]=i;//第0行是不存arr1里面的值的
                    arr2[count][1]=j;//count是至少从1开始表示第一个值
                    arr2[count][2]=arr1[i][j];//因为arr2[0]上面以及定义了//这也是为什么定义arr2时需要sum+1了
                }
            }
        }
        //输出稀疏数组
        for (int i = 0; i < arr2.length; i++) {
            System.out.println(arr2[i][0]+" "+
                    arr2[i][1]+" "+
                    arr2[i][2]+" "
/*11 11 2
1 2 1
2 3 2 */
                    //上面的运行结果表示有一个arr1数组11行11列有两个有效数组
                    //1行2列的数为1
                    //2行3列的数为2

            );
            }

还原稀疏数组

arr3,主要注意输入的对应每一个[ ]表示什么


        System.out.println("还原");
        //1.读取稀疏数组
        int[][] arr3=new int[arr2[0][0]][arr2[0][1]];
        //2.进行赋值
        for (int i = 1; i < arr2.length; i++) {
            arr3[arr2[i][0]][arr2[i][1]]=arr2[i][2];//arr2[i][2]=表示值
            }
        for (int[] ints : arr3) {
            for (int anInt : ints) {
                System.out.print(anInt+" ");
            }
            System.out.println();
        }

核心部分

1.arr2数组的定义
int[][]arr2=new int[sum+1][3];
        arr2[0][0]=11;
        arr2[0][1]=11;
        arr2[0][2]=sum+1;

        int count=0;
        for (int i = 0; i < arr1.length; i++) {
            for (int j = 0; j < arr1.length; j++) {
                if(arr1[i][j]!=0){
                    count++;
                 arr2[count][i]=i;
                 arr2[count][j]=i;
                 arr2[count][2]=arr1[i][j];
                }
            }
数组arr3的还原
System.out.println("还原");
        //1.读取稀疏数组
        int[][] arr3=new int[arr2[0][0]][arr2[0][1]];
        //2.进行赋值
        for (int i = 1; i < arr2.length; i++) {
            arr3[arr2[i][0]][arr2[i][1]]=arr2[i][2];//arr2[i][2]=表示值
            }
        for (int[] ints : arr3) {
            for (int anInt : ints) {
                System.out.print(anInt+" ");
            }
            System.out.println();
        }

整体代码

package Array;

import java.io.PrintStream;

//稀疏数组  //黑白棋//0就是没有棋子,1表示黑棋2表示白棋
public class Demo08 {
    public static void main(String[] args) {
            //定义一个二位数组
        int[][] arr1=new int[11][11];
        arr1[1][2]=1;
        arr1[2][3]=2;
        for (int[] ints : arr1) {
            for (int anInt : ints) {
                System.out.print(anInt+" ");
            }
            System.out.println();
        }

        //转换为稀疏数组保存
        //1.获取有效值的个数
        int sum=0;
        for (int i = 0; i < 11; i++) {
            for (int j = 0; j < 11; j++) {
                if (arr1[i][j]!=0){
                    sum++;
                }
            }
        }
        System.out.println("有效值的个数:"+sum);//sum=2
        //创建一个稀疏数组的数组//作用是保存数值的位置和值
        //所以需要判断sum然后利用sum+1表示需要存多少个值
        //3是固定的arr[x的位置][y的位置]=对应的值;
        int[][]arr2=new int[sum+1][3];
        arr2[0][0]=11;//表示存了多少行
        arr2[0][1]=11;//表示存了多少列
        arr2[0][2]=sum;//表示存了多少个值

        //遍历二维数组进行将arr1里的非0的值存放在arr2
        int count=0;
        for (int i = 0; i < arr1.length; i++) {
            for (int j = 0; j < arr1[i].length; j++) {
                if(arr1[i][j]!=0){
                    count++;
                    arr2[count][0]=i;//第0行是不存arr1里面的值的
                    arr2[count][1]=j;//count是至少从1开始表示第一个值
                    arr2[count][2]=arr1[i][j];//因为arr2[0]上面以及定义了//这也是为什么定义arr2时需要sum+1了
                }
            }
        }
        //输出稀疏数组
        for (int i = 0; i < arr2.length; i++) {
            System.out.println(arr2[i][0]+" "+
                    arr2[i][1]+" "+
                    arr2[i][2]+" "
/*11 11 2
1 2 1
2 3 2 */
                    //上面的运行结果表示有一个arr1数组11行11列有两个有效数组
                    //1行2列的数为1
                    //2行3列的数为2

            );
            }

        System.out.println("还原");
        //1.读取稀疏数组
        int[][] arr3=new int[arr2[0][0]][arr2[0][1]];
        //2.进行赋值
        for (int i = 1; i < arr2.length; i++) {
            arr3[arr2[i][0]][arr2[i][1]]=arr2[i][2];//arr2[i][2]=表示值
            }
        for (int[] ints : arr3) {
            for (int anInt : ints) {
                System.out.print(anInt+" ");
            }
            System.out.println();
        }


        }
        }



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值