sparseArray 稀疏数组
应用场景:用于二维数组的大小优化,当二维数组中有大量相同的值时。
---------------------------------------代码实现---------------------------------------
public static void main(String[] args) {
//二维数组
int a[][] = new int[5][5];
a[1][2] = 3;
a[2][4] = 5;
a[3][1] = 1;
for (int[] ints : a) {
for (int anInt : ints) {
System.out.printf("%d\t",anInt);
}
System.out.println();
}
}

如上图一个二维数组,里面有25个元素,其中有22个0,这时就可以用稀疏数组优化存储大小。
此时计算出的稀疏数组格式应该为:
5 5 3 //行数,列数,特殊值个数
1 2 3 //第2行第3列的值为3
2 4 5 //第3行第5列的值为5
3 1 1 //第4行第2列的值为1
这样新的稀疏数组中的只有12个元素,相较之前二维数组中的25个已经明显看出区别。
---------------------------------------代码实现---------------------------------------
//得到特殊元素总数
int sum = 0;
for (int[] ints : a) {
for (int anInt : ints) {
if(anInt != 0) sum++;
}
}
System.out.println("特殊元素总数为:"+sum);
//新建一个稀疏数组
int sparseArray[][] = new int[sum+1][3];
//第一行数据赋值 5行5列 sum个特殊元素
sparseArray[0][0] = 5;
sparseArray[0][1] = 5;
sparseArray[0][2] = sum;
//赋值
int z = 1;//用于计算稀疏数组中的行下标
for (int i = 0;i < a.length;i++){
for (int j = 0;j < a[i].length;j++){
if(a[i][j] != 0){
//z=1表示:当检测到第1个特殊元素时,把这个元素的下标和value存到稀疏数组的第二行(由于第一行存了数组信息5行5列3个元素,所以这里存第二行)
sparseArray[z][0] = i;
sparseArray[z][1] = j;
sparseArray[z][2] = a[i][j];
z++;
}
}
}
//打印
System.out.println("稀疏数组");
for (int[] ints : sparseArray) {
for (int anInt : ints) {
System.out.printf("%d\t",anInt);
}
System.out.println();
}
控制台输出:

接下来记录将稀疏数组再转化成二维数组
---------------------------------------代码实现---------------------------------------
//恢复成二维数组
int row = sparseArray[0][0];//得到行数
int col = sparseArray[0][1];//得到列数
int b[][] = new int[row][col];//此时得到了一个5行5列元素全是0的二维数组
//从第二行开始遍历sparseArray给新建的二维数组赋值
for (int i = 1;i < sparseArray.length;i++){
int x = sparseArray[i][0];//拿到多少行x
int y = sparseArray[i][1];//拿到多少列y
b[x][y] = sparseArray[i][2];//在x,y处赋值
}
//打印
System.out.println("新的二维数组");
for (int[] ints : b) {
for (int anInt : ints) {
System.out.printf("%d\t",anInt);
}
System.out.println();
}
得到结果

好的一逼!
本文介绍了如何使用sparseArray稀疏数组技术来压缩存储大量0的二维数组,展示了从创建、填充特殊值到还原成普通二维数组的过程,并强调了存储效率的提升。
878





