文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Java二维数组与稀疏数组相互转换实现详解

2024-04-02 19:55

关注

一、稀疏数组

1、什么是稀疏数组

当一个数组中大部分元素为0,或者为同一个值的数组时,可以用稀疏数组来保存该数组。稀疏数组,记录一共有几行几列,有多少个不为零的值或相同的值。

简单来说就是将大规模的数组缩小成小规模的数据,从而减少空间浪费。

2、图示

上面的图示中,左侧是二维数组,右侧是稀疏数组,将二维数组转成稀疏数组,明显的可以看出空间减少了,可以有效的节约空间,提高效率。那么二维数组怎么生成稀疏数组呢?其实很简单,因为二维数组有特定的格式,按格式将二维数组中的数据放入稀疏数组即可。

3、稀疏数组的表达方式

稀疏数组的列是固定的,只有三列,第一列表示二维数组的行,第二列表示二维数组的列,第三列表示二维数组非零数的个数。稀疏数组的第一行是固定的,用来表示总行数,总列数,总个数。其余行数根据个数而定。

二、二维数组→稀疏数组

根据上图所示:

第一步:创建二维数组

//首先创建二维数组
int[][] ChessArr1 = new int[11][11];
//赋值
ChessArr1[1][2] = 1;
ChessArr1[2][3] = 2;
//循环遍历得到非零个数
int num = 0;
for(int[] row : ChessArr1) {
   for(int data : row) {
       if(data != 0) {
           num++;
        }
   }
}

上面用到了增强for循环,第一个增强for循环表示每一个row代表一行(二维数组的行)也就相当与一维数组,第二个增强for循环再遍历一维数组得到每一个数据data来进行判断是否是非零数。

第二步:创建稀疏数组,并赋值

int[][] SparseArr = new int[num + 1][3];
//第一行赋值
SparseArr[0][0] = 11;
SparseArr[0][1] = 11;
SparseArr[0][2] = num;

前面分析的时候说了,第一行是固定的,二维数组的大小是知道的,所以行列的总数可以直接赋值,总有效个数也求了,也可以直接赋值。

第三步:遍历二维数组并赋值给稀疏数组

        int count = 0;
        for(int i = 0; i < 11; i++) {
            for(int j = 0; j < 11; j++) {
                if(ChessArr1[i][j] != 0) {
                    count++;
                    SparseArr[count][0] = i;
                    SparseArr[count][1] = j;
                    SparseArr[count][2] = ChessArr1[i][j];
                }
            }
        }

遍历二维数组,判断条件是这个数不等于零,此处需要一个计数变量,每符合一个非零数,计数变量就加一,可以用来表示稀疏数组的第几行,稀疏数组的列数是固定的,所以找到后直接进行赋值操作。

最后打印稀疏数组即可。

完整代码

        //首先创建二维数组
        int[][] ChessArr1 = new int[11][11];
        //赋值
        ChessArr1[1][2] = 1;
        ChessArr1[2][3] = 2;
        //将原始数组转 换成 稀疏数组
        //1、先遍历原始数组得到非0数的个数
        int num = 0;
        for(int[] row : ChessArr1) {
            for(int data : row) {
                if(data != 0) {
                    num++;
                }
            }
        }
        //2、创建 稀疏数组
        int[][] SparseArr = new int[num + 1][3];
        //3、第一行赋值
        SparseArr[0][0] = 11;
        SparseArr[0][1] = 11;
        SparseArr[0][2] = num;
        //4、循环赋非0值
        int count = 0;
        for(int i = 0; i < 11; i++) {
            for(int j = 0; j < 11; j++) {
                if(ChessArr1[i][j] != 0) {
                    count++;
                    SparseArr[count][0] = i;
                    SparseArr[count][1] = j;
                    SparseArr[count][2] = ChessArr1[i][j];
                }
            }
        }
        //5、打印稀疏数组
        System.out.println("\n===打印稀疏数组===");
        for(int[] row : SparseArr) {
            for(int data : row) {
                System.out.printf("%d\t",data);
            }
            System.out.println();
        }

三、稀疏数组→二维数组

第一步:创建新的二维数组

//1、定义一个新的二维数组
int[][] ChessArr2 = new int[SparseArr[0][0]][SparseArr[0][1]];

二维数组的大小来自稀疏数组的第一行第一列和第一行第二列,也就是 SparseArr[0][0] 和 SparseArr[0][1] ;初始状态下的二维数组数据全为零。

第二步:循环遍历并赋值

        //2、赋值
        for(int i = 1; i <= SparseArr[0][2]; i++) {
            ChessArr2[SparseArr[i][0]][SparseArr[i][1]] = SparseArr[i][2];
        }

因为除了少数是有效个数,其他全是零,所以我们只需要遍历有效个数。i 表示第几个有效个数也表示当前这个数在稀疏数组中的行,如上图所示:如 i = 1,表示在稀疏数组的第一行,它在二维数组中的位置为 (1,2),数值为 1 ;所以行和列分别是SparseArr[1][0]和SparseArr[1][1],数值为SparseArr[1][2]。

所以赋值表达式为:ChessArr2[SparseArr[i][0]][SparseArr[i][1]] = SparseArr[i][2]。

完整代码

        //将稀疏数组 转换成 二维数组
        //1、定义一个新的二维数组
        int[][] ChessArr2 = new int[SparseArr[0][0]][SparseArr[0][1]];
        //2、赋值
        for(int i = 1; i <= SparseArr[0][2]; i++) {
            ChessArr2[SparseArr[i][0]][SparseArr[i][1]] = SparseArr[i][2];
        }
        //3、打印新的二维数组
        System.out.println("\n===新的二维数组===");
        for(int[] row : ChessArr2) {
            for(int data : row) {
                System.out.printf("%d\t",data);
            }
            System.out.println();
        }

到此这篇关于Java二维数组与稀疏数组相互转换实现详解的文章就介绍到这了,更多相关Java二维数组与稀疏数组转换内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯