稀疏数组(SparseArray)
二维数组在存储时会采用稀疏数组的方式来减少资源占用。
Example
假设有一个6*6的二维数组a,其中a[1][1]和a[2][2]有非零值,而其余位置均为0。那么在存储时就可以采用稀疏数组来减少冗余数据。
二维数组对应的稀疏数组如上图所示。其中第一行前两个元素分别代表原数组的行和列数,第三个元素是原二维数组有效数据个数(除0之外)。第二行代表第一个有效数据的行数、列数、具体数值。第三行代表第二个有效数据。
换言之,稀疏数组的行数由有效数据的个数决定,列数固定为三列,分别代表“行”、“列”、“值”。
将二维数组转化为稀疏数组的步骤
- 获得二维数组有效数据个数(经历两次for循环遍历)
int sum =0;
for (int i = 0; i <chessArr1.length ; i++) {
for (int j = 0; j <chessArr1[i].length ; j++) {
if (chessArr1[i][j]!=0)
sum++;
}
}
- 创建稀疏数组
int sparseArr[][]=new int[sum+1][3];
sparseArr[0][0]=chessArr1.length;
sparseArr[0][1]=chessArr1[0].length;
sparseArr[0][2]=sum;
- 给稀疏数组赋值
int count=0;
for (int i = 0; i <chessArr1.length ; i++) {
for (int j = 0; j <chessArr1[i].length ; j++) {
if (chessArr1[i][j]!=0) {
count++;
sparseArr[count][0]=i;
sparseArr[count][1]=j;
sparseArr[count][2]=chessArr1[i][j];
}
}
}
- 稀疏数组转化为二维数组
int length1=sparseArr[0][0];
int length2=sparseArr[0][1];
int chessArr2[][]=new int[length1][length2];
for (int i = 1; i <sparseArr.length ; i++) {
chessArr2[sparseArr[i][0]][sparseArr[i][1]]=sparseArr[i][2];
}
ref : 源码参照github仓库链接