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

稀疏数组:

二维数组转稀疏数组:二维数组都转稀疏数组很简单,因为稀疏数组的第一行存放的是二维数组的总行数,总列数和有效数据总数,所以我们只需要遍历出二维数组的有效数据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版权协议,转载请附上原文出处链接和本声明。