上一篇文章中解释了什么是稀疏数组,以及什么时候使用稀疏数组,那么这篇文章采用了一个实例来更好地说明稀疏数组的作用,我跟大家一起用代码实现二维数组与稀疏数组之间的转换。
稀疏数组应用实例:
- 使用稀疏数组,来保存二维数组(棋盘,地图)。
- 把稀疏数组存盘,并且可以恢复原来的二维数组。
二维数组转稀疏数组的思路:
通过上一篇文章我们可以了解到,稀疏数组是一个行不确定,三列的动态数组,因此思路如下:
- 遍历原始的二维数组,得到有效数据的个数sum。
- 根据sum,可以创建稀疏数组sparseArr,大小为int[sum+1][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(); }
其中具体关键步骤都已经注释,运行得到的结果如图:
从图中可以看到 得到的是正确的稀疏数组,接下来要做的就是将稀疏数组重新转换为原始的二维数组。
稀疏数组转原始二维数组的思路:
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(" "); }
写完后运行,结果如下:
正确恢复,成功运行,最后附上包括类名在内的全部伪代码:
/* * 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(" "); } }}
二维数组可以从文件中读取,同样,得到的稀疏数组也可以直接存在磁盘当中,方便使用,使用稀疏数组的目的就是缩小数组以及程序的规模,起到了一个压缩的作用。