上一篇文章中解释了什么是稀疏数组,以及什么时候使用稀疏数组,那么这篇文章采用了一个实例来更好地说明稀疏数组的作用,我跟大家一起用代码实现二维数组与稀疏数组之间的转换。

稀疏数组应用实例:

  1. 使用稀疏数组,来保存二维数组(棋盘,地图)。
  2. 把稀疏数组存盘,并且可以恢复原来的二维数组。

二维数组转稀疏数组的思路:

 通过上一篇文章我们可以了解到,稀疏数组是一个行不确定,三列的动态数组,因此思路如下:

  1. 遍历原始的二维数组,得到有效数据的个数sum。
  2. 根据sum,可以创建稀疏数组sparseArr,大小为int[sum+1][3]。
  3. 将二维数组的有效数据存入到稀疏数组当中。

 这样看起来就比较清晰,我将自己的代码附上,这里我是自己设置的原始二维数组,当然也可以从文件中读取,代码中为一个小例子:

int chessArr1[][] = new int [11][12];        chessArr1[1][2] = 1;        chessArr1[2][3] = 2;        chessArr1[4][5] = 2;        //输出原始二维数组         System.out.println("原始的二维数组");        for(int []row : chessArr1){            for(int data : row){                System.out.print(data+"\t");            }            System.out.println(" ");        }        //将二维数组转为稀疏数组        //遍历二维数组,得到非0数据的个数        int sum=0;        for(int i=0;i        {            for(int j=0;j            {                if(chessArr1[i][j]!=0)                {                    sum++;                }            }        }//        System.out.println(sum);           //创建对应的稀疏数组           int sparseArr[][] = new int [sum+1][3];           //给稀疏数组赋值           sparseArr[0][0] = chessArr1.length;           sparseArr[0][1] = chessArr1[0].length;           sparseArr[0][2] = sum;                      //遍历二维数组,将非0的值存入稀疏数组中           int count = 0;  //count用于记录是第几个非0数据           for(int i=0;i             {               for(int j=0;j                 {                   if(chessArr1[i][j]!=0)                     {                       count++;                       sparseArr[count][0] = i;                       sparseArr[count][1] = j;                       sparseArr[count][2] = chessArr1[i][j];                     }                 }             }           //输出稀疏数组的形式           System.out.println();           System.out.println("得到的稀疏数组为");           for(int i=0;i           {               for(int j = 0;j < sparseArr[i].length;j++)               {                   System.out.print(sparseArr[i][j]+"\t");               }                System.out.println();           }

其中具体关键步骤都已经注释,运行得到的结果如图:

java 一个数组赋值另一个地址不变_二维数组

   从图中可以看到  得到的是正确的稀疏数组,接下来要做的就是将稀疏数组重新转换为原始的二维数组。

稀疏数组转原始二维数组的思路:

1.先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组。

2.在读取稀疏数组后几行的数据,并赋值给原始的二维数组即可。

这个部分比较简单,具体代码如下:

//将稀疏数组恢复成原始的二维数组           //先读取稀疏数组的第一行,根据第一行的数据创建原始的二维数组           int chessArr2[][] = new int[sparseArr[0][0]][sparseArr[0][1]];           //再读取稀疏数组后几行的数据,并赋值给原始的二维数组           for(int i=1;i           {               chessArr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];           }           //输出恢复后的二维数组           System.out.println();           System.out.println("恢复后的二维数组");           for(int []row : chessArr2)           {              for(int data : row)              {                System.out.print(data+"\t");              }             System.out.println(" ");           }

写完后运行,结果如下:

java 一个数组赋值另一个地址不变_二维数组_02

正确恢复,成功运行,最后附上包括类名在内的全部伪代码:

/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */package sparsearray;/** * * @author Administrator */public class SparseArray {    public static void main(String[] args){        //创建一个原始的二维数组 11*11        //0表示没有棋子,1表示黑子,2表示蓝子        int chessArr1[][] = new int [11][12];        chessArr1[1][2] = 1;        chessArr1[2][3] = 2;        chessArr1[4][5] = 2;        //输出原始二维数组         System.out.println("原始的二维数组");        for(int []row : chessArr1){            for(int data : row){                System.out.print(data+"\t");            }            System.out.println(" ");        }        //将二维数组转为稀疏数组        //遍历二维数组,得到非0数据的个数        int sum=0;        for(int i=0;i        {            for(int j=0;j            {                if(chessArr1[i][j]!=0)                {                    sum++;                }            }        }//        System.out.println(sum);           //创建对应的稀疏数组           int sparseArr[][] = new int [sum+1][3];           //给稀疏数组赋值           sparseArr[0][0] = chessArr1.length;           sparseArr[0][1] = chessArr1[0].length;           sparseArr[0][2] = sum;                      //遍历二维数组,将非0的值存入稀疏数组中           int count = 0;  //count用于记录是第几个非0数据           for(int i=0;i             {               for(int j=0;j                 {                   if(chessArr1[i][j]!=0)                     {                       count++;                       sparseArr[count][0] = i;                       sparseArr[count][1] = j;                       sparseArr[count][2] = chessArr1[i][j];                     }                 }             }           //输出稀疏数组的形式           System.out.println();           System.out.println("得到的稀疏数组为");           for(int i=0;i           {               for(int j = 0;j < sparseArr[i].length;j++)               {                   System.out.print(sparseArr[i][j]+"\t");               }                System.out.println();           }           //将稀疏数组恢复成原始的二维数组           //先读取稀疏数组的第一行,根据第一行的数据创建原始的二维数组           int chessArr2[][] = new int[sparseArr[0][0]][sparseArr[0][1]];           //再读取稀疏数组后几行的数据,并赋值给原始的二维数组           for(int i=1;i           {               chessArr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];           }           //输出恢复后的二维数组           System.out.println();           System.out.println("恢复后的二维数组");           for(int []row : chessArr2)           {              for(int data : row)              {                System.out.print(data+"\t");              }             System.out.println(" ");           }    }}

  二维数组可以从文件中读取,同样,得到的稀疏数组也可以直接存在磁盘当中,方便使用,使用稀疏数组的目的就是缩小数组以及程序的规模,起到了一个压缩的作用。