特殊的二维数组:稀疏数组与二维数组的转换

概述

稀疏数组本质上还是一个二维数组,属于有序数列,只不过其存放数据的位置有其特殊的意义。稀疏数组可以看作是对二维数组一种压缩后的描述,极大的节省了数据存放空间和数据读取时间。

稀疏数组的定义:

  • 稀疏数组只有3列
  • 稀疏数组第一行记录了源二维数组的规模(多少行&多少列),以及有效数据的数量
  • 之后的每一行定义原二维数组有效值的行&列信息,以及实际值

Demo

package com.leolee.dataStructure.sparseArray;

/**
 * @ClassName SparseArray
 * @Description: 稀疏数组解决棋盘记录问题
 * @Author LeoLee
 * @Date 2020/9/10
 * @Version V1.0
 **/
public class SparseArray {


    public static void main(String[] args) {

        //创建二位数组记录棋盘的原数据,0-没有棋子 1-黑子 2-白子,棋盘大小11*11
        int chessboard[][] = new int[11][11];
        //任意定义几个棋盘上的棋子位置
        chessboard[2][3] = 1;
        chessboard[5][7] = 2;
        //输出棋盘情况
        System.out.println("原始棋盘:");
        for (int[] row : chessboard) {
            for (int i : row) {
                System.out.printf("%d\t", i);
            }
            System.out.println();
        }

        System.out.println("------------------二维数组转稀疏数组------------------");

        //创建稀疏数组,并将二维数组数据转存到稀疏数组内
        int dataSum = 0;//有效数据个数
        for (int i = 0; i < chessboard.length; i++) {
            for (int j = 0; j < chessboard.length; j++) {//由于这里列和行都是11,所以也用chessboard.length来代替
                if (chessboard[i][j] != 0) {
                    dataSum++;
                }
            }
        }
        System.out.println("dataSum:" + dataSum);
        //创建稀疏数组
        int sparseArray[][] = new int[dataSum + 1][3];
        //第一行存原始数组数据的大小范围(多少行&多少列)以及有效数据个数
        sparseArray[0][0] = 11;
        sparseArray[0][1] = 11;
        sparseArray[0][2] = dataSum;
        //遍历二维数组存放到稀疏数组
        int count = 0;//计数器,用于记录第几个有效数据
        for (int i = 0; i < chessboard.length; i++) {
            for (int j = 0; j < chessboard.length; j++) {//由于这里列和行都是11,所以也用chessboard.length来代替
                if (chessboard[i][j] != 0) {
                    count++;
                    sparseArray[count][0] = i;//记录原数据在二维数组的行
                    sparseArray[count][1] = j;//记录元数据在二维数组的列
                    sparseArray[count][2] = chessboard[i][j];//记录原数据的值
                }
            }
        }
        System.out.println("稀疏数组:");
        for (int i = 0; i < sparseArray.length; i++) {
            for (int j = 0; j < dataSum + 1; j++) {
                System.out.printf("%d\t", sparseArray[i][j]);
            }
            System.out.println();
        }

        System.out.println("------------------稀疏数组转二维数组------------------");

        //初始化二维数组
        int chessboard2[][] = new int[sparseArray[0][0]][sparseArray[0][1]];
        //赋值
        for (int i = 1; i < sparseArray.length; i++) {
            chessboard2[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2];
        }
        //转为二维数组结果:
        for (int[] row : chessboard2) {
            for (int i : row) {
                System.out.printf("%d\t", i);
            }
            System.out.println();
        }

    }


}

输出:

原始棋盘:
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	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	0	0	
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	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	0	0	0	0	
------------------二维数组转稀疏数组------------------
dataSum:2
稀疏数组:
11	11	2	
2	3	1	
5	7	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	1	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	0	0	
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	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	0	0	0	0

猜你喜欢

转载自blog.csdn.net/qq_25805331/article/details/108513810
今日推荐