稀疏数组

 

稀疏数组说白了就是对原数组的简化数组,抛去重复的元素,保存记录的元素,例如我们写五子棋程序时,记录棋盘使用的是二维数组,但是当我们需要保存存档时,因为棋盘上还有很多位置没有落子,所以我们会保存很多无用的数据(空棋盘),这时我们可以使用稀疏数组来保存数据,稀疏数组的第一行存放总行数,总列数和落子的总个数,之后的每行遍可以存放每个棋子的横坐标,纵坐标和值。

原数组:

稀疏数组: 

二维数组转稀疏数组:二维数组都转稀疏数组很简单,因为稀疏数组的第一行存放的是二维数组的总行数,总列数和有效数据总数,所以我们只需要遍历出二维数组的有效数据sum,便可以创建稀疏数组sparseArr[sum+1][3](稀疏数组的行永远是二维数组的总值+1,列是3),然后开始存放二维数组的有效数据。

稀疏数组转二维数组:稀疏数组的第一行存放的是二维数组的总行数和总列数,所以需要先取出稀疏数组的第一行数据来创建二维数组,之后在继续读取稀疏数组的每行来为二位数组赋值。

代码实现:

public class SparseArray {
    public static void main(String[] args) {
        //创建一个原始的二维数组,10行10列;0为无棋子,1为黑子,2为白子
        int[][] Array =new int[10][10];
        Array[1][2] = 1;
        Array[2][5] = 2;
        //输出原始数组
        System.out.println("原始二维数组:");
        for(int row[]:Array){
            for(int col:row){
                System.out.print(col+"\t");
            }
            System.out.println();
        }
        //遍历数组,获得有效数据sum
        int sum = 0;
        for(int i=0;i<Array.length;i++){
            for (int j=0;j<Array[0].length;j++){
                if(Array[i][j]!=0){
                    sum++;
                }
            }
        }
        //创建稀疏数组
        int[][] spareArray = new int[sum+1][3];
        //为稀疏数组的第一行赋值
        spareArray[0][0] = Array.length;
        spareArray[0][1] = Array[0].length;
        spareArray[0][2] = sum;
        //为稀疏数组的其他行赋值,首先获取到原数组的有效数据,然后赋值
        int count = 0;//自增器
        for(int i = 0;i<Array.length;i++){
            for(int j=0;j<Array[0].length;j++){
                if(Array[i][j]!=0){
                    spareArray[++count][0] = i;
                    spareArray[count][1] = j;
                    spareArray[count][2] = Array[i][j];
                }
            }
        }
        //------------将系数数组存入磁盘------------
        //遍历稀疏数组
        System.out.println("稀疏数组:");
        for(int row[]:spareArray){
            for(int col:row){
                System.out.print(col+"\t");
            }
            System.out.println();
        }

        //---------------从磁盘中取出稀疏数组-----------------
        //将稀疏数组恢复成二维数组
        int[][] array2 = new int[spareArray[0][0]][spareArray[0][1]];
        //恢复二维数组
        for(int i =1;i<spareArray.length;i++){
            array2[spareArray[i][0]][spareArray[i][1]]=spareArray[i][2];
        }
        //遍历恢复后的二维数组
        System.out.println("恢复后的二维数组:");
        for(int row[] : array2){
            for(int date : row){
                System.out.print(date+"\t");
            }
            System.out.println();
        }
    }
}

运行结果:


版权声明:本文为weixin_47027644原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。