稀疏数组的定义
稀疏数组就是数组中,大部分的元素值都未被使用(或都为0),在数组中仅有少部分的空间使用。因此造成内存空间的浪费,为了解决这问题,并且不影响数组中原
有的元素值,我们采用了一种压缩的方式来 表示稀疏数组的内容。
代码
改进:正常的稀疏数组的每行的数据个数都是统一的,我考虑了不同长度的列,因此将稀疏数组的第二个值改成了总共的数据(原表示每行的个数)
public static void main(String[] args) {
//测试数据,可输入任意长度的行列
int[][] Data={{0,0,0,0,0,0,0},
{0,3,0,0},
{0,0,0,0,0,0,0},
{1,4,0,0,0,0,0},
{0,0,7,0,0,0,0},
{0,0,0,0,0,5,0},
{0,0,0,0,0},
{0,0,0,0,0,0,0},
{0,0,0,0,0,0,0}
};
int[][] result=XiShu(Data);
for (int i=0;i<result.length;i++){
for(int j=0;j<result[i].length;j++){
System.out.print(" "+result[i][j]+" ");
}
System.out.println();
}
}
public static int[][] XiShu(int[][] beginData){
//表示非0的数
int num=0;
int numall=0;
for(int i=0;i<beginData.length;i++) {
for (int j = 0; j < beginData[i].length; j++) {
numall++;
if (beginData[i][j] != 0) {
num++;
}
}
}
//索引
int index=1;
int[][] endData=new int[num+1][3];
//第一列表示 原数据库的几行 一共有几个数据(稀疏数组原本是记录每行几个数据,这里记录了数据个数) 一共的非0数据
endData[0][0]=beginData.length;
endData[0][1]=numall;
endData[0][2]=num;
for(int i=0;i<beginData.length;i++) {
for (int j = 0; j < beginData[i].length; j++) {
if (beginData[i][j] != 0) {
//表示i行 j列 的数据是多少
endData[index][0]=i;
endData[index][1]=j;
endData[index][2]=beginData[i][j];
index++;
}
}
}
return endData;
}