JAVA中的二维数组和稀疏数组之间的转换

由于是开学季,也确实是好久没有更新博客了,主要也是因为自己一直在学新东西,之前的没啥好分享的了。
今天开始主要就是更新JAVA中的数据结构,第一篇就是关于稀疏数组的转换问题。
说到稀疏数组,首先要知道稀疏数组是什么?
在这里插入图片描述
我在网上找到了一张图。
在这里插入图片描述

我们来看左边,是一个正常的二维数组,但是这个二维数组的大部分元素都是0.似乎有些浪费空间,我们有没有一种方法能够简化这种二维数组。

这个时候稀疏数组出现了,让我们看一下右边的数组。
我们记住,稀疏数组的列数一定是3,分别代表行列值。

而且稀疏数组的第一行数据代表的是:原数组的行数,列数,不为0的值的个数。
第二行到最后一行代表的是:不为0值的元素,在原二维数组所占的行数,列数,值。

那如果我们知道了原理的话,就开始写代码来实现他。
在这里插入图片描述

OKK,那我们就开始代码:
首先创建类啥的都不用多说了:
创建好我们先来写一个二维数组:

  int oldArr[][] = new int[10][10];
        oldArr[1][1]=1;
        oldArr[2][2]=2;
        //打印二维数组
        for(int x=0;x<oldArr.length;x++){
            for(int y=0;y<oldArr[0].length;y++){
                System.out.printf("%d ",oldArr[x][y]);
            }
            System.out.printf("\n");
        }

我这是一个10行10列的二维数组,为了方便我只给两个位置设置值了:
在这里插入图片描述
我们考虑一下
稀疏数组的列一定是3,然后第一行的三个元素应该属这个二维数组的行,列,不为0的值的个数;
第二行和第三行分别是里面的1,2所在的位置和值。

OK,有这个思路
那我们就开始了。
在这里插入图片描述
首先呢我们要找出二维数组不为0的值的个数,设置为稀疏数组第一行的第三个。

  //统计不为0的个数
        int sum=0;
        for(int x=0;x<oldArr.length;x++){
            for(int y=0;y<oldArr[0].length;y++){
                if(oldArr[x][y] != 0){
                    sum++;

                }
            }
        }
        System.out.println(sum);
        //创建稀疏数组
        int sparceArr[][]=new int [sum+1][3];
        //第一行数据
        sparceArr[0][0]=oldArr.length;
        sparceArr[0][1]=oldArr[0].length;
        sparceArr[0][2]=sum;

OK,这样稀疏数组的第一行也就完成了。
然后我们要写出剩下第二行到最后的数据:

        //剩下的数据
        int num=1;
        for(int x=0;x<oldArr.length;x++){
            for(int y=0;y<oldArr[0].length;y++){
                if(oldArr[x][y] != 0){
                    sparceArr[num][0]=x;
                    sparceArr[num][1]=y;
                    sparceArr[num][2]=oldArr[x][y];
                    num++;
                }
            }
        }

在这里我们用num计数,来循环设置稀疏数组里面的值。

OK,这样的话转化成稀疏数组也就完成了,最后的话我们再来做一下如何把稀疏数组转化为原数组。
在这里插入图片描述
思路的话,其实会更简单,只要理解了稀疏数组里面每个值代表的意思,实现出来就会很简单:

 int newArr[][] = new int[sparceArr[0][0]][sparceArr[0][1]];
        for(int x=1;x<sparceArr[0][2]+1;x++){
            newArr[sparceArr[x][0]][sparceArr[x][1]]=sparceArr[x][2];
        }

首先定义出一个新数组,大小由稀疏数组的第一行决定。
然后稀疏数组剩下的数据决定了原数组不为0的值的位置及value。

这样的话,一个二维数组从转换到稀疏数组,再从稀疏数组转换成原数组的全过程也就实现完了。
其实,只要理解了思路,并且知道稀疏数组的每个值的概念,那么实现出来的方法就不会很难,用到的只是也会很基础,稍微不常用的也就是表示二维数组的行数和列数。

OK,最后再把整个代码复制出来吧。

public class SparseArr {
    public static  void  main(String[] args){
        int oldArr[][] = new int[10][10];
        oldArr[1][1]=1;
        oldArr[2][2]=2;
        //打印二维数组
        for(int x=0;x<oldArr.length;x++){
            for(int y=0;y<oldArr[0].length;y++){
                System.out.printf("%d ",oldArr[x][y]);
            }
            System.out.printf("\n");
        }
        //统计不为0的个数
        int sum=0;
        for(int x=0;x<oldArr.length;x++){
            for(int y=0;y<oldArr[0].length;y++){
                if(oldArr[x][y] != 0){
                    sum++;

                }
            }
        }
        System.out.println(sum);
        //创建稀疏数组
        int sparceArr[][]=new int [sum+1][3];
        //第一行数据
        sparceArr[0][0]=oldArr.length;
        sparceArr[0][1]=oldArr[0].length;
        sparceArr[0][2]=sum;
        //剩下的数据
        int num=1;
        for(int x=0;x<oldArr.length;x++){
            for(int y=0;y<oldArr[0].length;y++){
                if(oldArr[x][y] != 0){
                    sparceArr[num][0]=x;
                    sparceArr[num][1]=y;
                    sparceArr[num][2]=oldArr[x][y];
                    num++;
                }
            }
        }
        System.out.println("转换成稀疏数组后");
        //打印稀疏数组
        for(int x=0;x<sparceArr.length;x++){
            for(int y=0;y<sparceArr[0].length;y++){
                System.out.printf("%d ",sparceArr[x][y]);
            }
            System.out.printf("\n");
        }
        //把稀疏数组转换成原数组
        int newArr[][] = new int[sparceArr[0][0]][sparceArr[0][1]];
        for(int x=1;x<sparceArr[0][2]+1;x++){
            newArr[sparceArr[x][0]][sparceArr[x][1]]=sparceArr[x][2];
        }
        //打印原数组
        for(int x=0;x<newArr.length;x++){
            for(int y=0;y<newArr[0].length;y++){
                System.out.printf("%d ",newArr[x][y]);
            }
            System.out.printf("\n");
        }
    }
}

如果哪里写的不够好,或者代码可以完善,可以自己进行修改,只是提供一个思路和方法。
OK,那么这一篇就结束了。

在这里插入图片描述

©️2020 CSDN 皮肤主题: 精致技术 设计师:CSDN官方博客 返回首页