一文看懂二维数组与稀疏数组的互相转换

一、应用场景

五子棋
使用二维数组保存五子棋当前棋子的位置

		//生成一个8×8的棋盘,白子用1表示,黑子用2表示,没有放置棋子的位置用0表示
        //第一个值为行,第二个值为列
        int basicArray[][] = new int[8][8];
        //三行四列为黑子
        basicArray[2][3] = 2;
        //四行五列为白子
        basicArray[3][4] = 1;
        //五行五列为黑子
        basicArray[4][4] = 2;
 		//打印原始数组查看数据是否正确
        System.out.println("原始数据");
        for (int[] row : basicArray){
            for (int result : row){
                System.out.print(result+"\t");
            }
            System.out.println();
        }
        
打印结果:
原始数据
0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	
0	0	0	2	0	0	0	0	
0	0	0	0	1	0	0	0	
0	0	0	0	2	0	0	0	
0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0

在这里插入图片描述

二、二维数组转稀疏数组

1.计算需要存储的数据条数

		//存放需要存储的数据条数
        int sum = 0;
        for(int[] row : basicArray){
            for (int result : row){
                if(result!=0){
                    sum++;
                }
            }
        }
        System.out.println("需要保存的数据条数:"+sum);
打印结果
需要保存的数据条数:3

2.创建稀疏数组

	//sum加上第一条存储原数组基本信息行
	int sparseArray[][] = new int[sum+1][3];

3.向稀疏数组中添加数据

		//添加原始数组信息
        //存储行数
        sparseArray[0][0] = basicArray.length;
        //存储列数
        sparseArray[0][1] = basicArray[0].length;
        //存储数据条数
        sparseArray[0][2] = sum;

        //添加所需数据信息
        int count = 0;
        for (int i = 0; i<sparseArray[0][0];i++){
            for (int j = 0;j < sparseArray[0][1];j++){
                if(basicArray[i][j]!=0){
                    //先进行自增,避免覆盖稀疏数组第一条基础信息
                    count++;
                    sparseArray[count][0] = i;
                    sparseArray[count][1] = j;
                    sparseArray[count][2] = basicArray[i][j];
                }
            }
        }

        System.out.println();
        //输出稀疏数组
        System.out.println("稀疏数组输出:");
        for(int i=0;i<sparseArray.length;i++) {
            System.out.printf("%d\t%d\t%d\n",sparseArray[i][0],sparseArray[i][1],sparseArray[i][2]);
        }
输出内容:
稀疏数组输出:
8	8	3
2	3	2
3	4	1
4	4	2

二维数组转稀疏数组完成
第一行为二维数组的基础数据,8行8列三条数据
剩下三行为二维数组中的非0数据
三行四列的值为2
四行五列的值为1
五行五列的值为2
tips:数组下标从0开始

三、稀疏数组转二维数组

1.创建接收数据的二维数组

 		//导出二维数组基本信息
        int rowNum = sparseArray[0][0];
        int colNum = sparseArray[0][1];
        //创建二维数组
        int resultArray[][] = new int[rowNum][colNum];

2.向填入二维数组有效数据

 		//填入二维数组有效数据
        for (int i = 1;i<=sparseArray[0][2];i++){
            int row = sparseArray[i][0];
            int col = sparseArray[i][1];
            int result = sparseArray[i][2];
            resultArray[row][col]= result;
        }

3.输出结果

		 //输出二维数组
        System.out.println("经过转换的结果数据");
        for (int[] row : resultArray){
            for (int result : row){
                System.out.print(result+"\t");
            }
            System.out.println();
        }
输出结果:
经过转换的结果数据
0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	
0	0	0	2	0	0	0	0	
0	0	0	0	1	0	0	0	
0	0	0	0	2	0	0	0	
0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0

看懂二维数组与稀疏数组的互相转换过程了嘛

附完整代码:

public static void main(String[] args) {
        //生成一个8×8的棋盘,白子用1表示,黑子用2表示,没有放置棋子的位置用0表示
        //第一个值为行,第二个值为列
        int basicArray[][] = new int[8][8];
        //三行四列为黑子
        basicArray[2][3] = 2;
        //四行五列为白子
        basicArray[3][4] = 1;
        //五行五列为黑子
        basicArray[4][4] = 2;

        //打印原始数组查看数据是否正确
        System.out.println("原始数据");
        for (int[] row : basicArray){
            for (int result : row){
                System.out.print(result+"\t");
            }
            System.out.println();
        }

        //存放需要存储的数据条数
        int sum = 0;
        for(int[] row : basicArray){
            for (int result : row){
                if(result!=0){
                    sum++;
                }
            }
        }
        System.out.println("需要保存的数据条数:"+sum);

        //创建稀疏数组
        int sparseArray[][] = new int[sum+1][3];

        //向稀疏数组中添加数据

        //添加原始数组信息
        //存储行数
        sparseArray[0][0] = basicArray.length;
        //存储列数
        sparseArray[0][1] = basicArray[0].length;
        //存储数据条数
        sparseArray[0][2] = sum;

        //添加所需数据信息
        int count = 0;
        for (int i = 0; i<sparseArray[0][0];i++){
            for (int j = 0;j < sparseArray[0][1];j++){
                if(basicArray[i][j]!=0){
                    //先进行自增,避免覆盖稀疏数组第一条基础信息
                    count++;
                    sparseArray[count][0] = i;
                    sparseArray[count][1] = j;
                    sparseArray[count][2] = basicArray[i][j];
                }
            }
        }

        System.out.println();
        //输出稀疏数组
        System.out.println("稀疏数组输出:");
        for(int i=0;i<sparseArray.length;i++) {
            System.out.printf("%d\t%d\t%d\n",sparseArray[i][0],sparseArray[i][1],sparseArray[i][2]);
        }

        //稀疏数组转二维数组
        //导出二维数组基本信息
        int rowNum = sparseArray[0][0];
        int colNum = sparseArray[0][1];
        //创建二维数组
        int resultArray[][] = new int[rowNum][colNum];

        //填入二维数组有效数据
        for (int i = 1;i<=sparseArray[0][2];i++){
            int row = sparseArray[i][0];
            int col = sparseArray[i][1];
            int result = sparseArray[i][2];
            resultArray[row][col]= result;
        }

        //输出二维数组
        System.out.println("经过转换的结果数据");
        for (int[] row : resultArray){
            for (int result : row){
                System.out.print(result+"\t");
            }
            System.out.println();
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值