什么是稀疏数组?
当一个元素中的大部分元素都为0,或者为同一数值时,可以用稀疏数组来保存。
稀疏数组格式:
第一行:原始数组有几行、几列、有效值个数
第二行存放第一个有效值:在第几行、第几列、值为多少
第三行存放第二个有效值:在第几行、第几列、值为多少
以此类推。。。。
可以参考下图:(左边数原始数组,后面是稀疏数组)
该原始数组 6行 7列 8个有效值,放在稀疏数组第一行,第二行就是第一个有效值,在第0行第3列,值为22,后面依次存放++个有效值 。
做个例子(写成代码):
把这个原始数组转换为稀疏数组:
首先,先写一个打印多维数组的方法:
public static void print(int[][]arrays){
for (int i = 0; i <arrays.length ; i++) {
System.out.println();
for (int j = 0; j <arrays[i].length ; j++) {
System.out.print(arrays[i][j]+"\t");
}
}
System.out.println("\n");
}
之前写过没什么问题。
然后再先打印出原始数组:
输出结果为:
接下来把原始数组转换为稀疏数组:
1.先计算有效值个数:
2.创建稀疏数组:
第三步:把稀疏数组后面几行输出出来
完整代码如下:
package array;
import java.util.Arrays;
public class Demo08 {
public static void main(String[] args) {
// 打印原始数组
System.out.println("打印原始数组==========================================================");
int [][] array = new int[11][11];
array[1][2] = 1;
array[2][3] = 2;
print(array);
System.out.println("打印稀疏数组=============================================================");
// 打印稀疏数组
// 1.判断有效值的个数
int sum = 0;
// 遍历原始数组array
for (int i = 0; i <array.length ; i++) {
for (int j = 0; j <array[i].length ; j++) {
// 判断值是否等于0
if(array[i][j] != 0){
sum++;
}
}
}
// 2.创建稀疏数组
int [][] array1 = new int[sum+1][3];
// 第一行 第一列 11行
array1[0][0] = 11;
// 第一行 第二列 11行
array1[0][1] = 11;
// 第一行 第三列 有效值个数
array1[0][2] = sum;
int count=0;
for (int i = 0; i <array.length; i++) {
for (int j = 0; j <array[i].length ; j++) {
// 如果值不为0,count++,用于当行数
if(array[i][j]!=0){
count++;
array1[count][0] = i;
array1[count][1] = j;
array1[count][2] = array[i][j];
}
}
}
print(array1);
// 打印多维数组
public static void print(int[][]arrays){
for (int i = 0; i <arrays.length ; i++) {
System.out.println();
for (int j = 0; j <arrays[i].length ; j++) {
System.out.print(arrays[i][j]+"\t");
}
}
System.out.println("\n");
}
}
完整输出结果:
在补充一个稀疏数组还原为原始数组(基于上面代码):
int[][] array2 = new int[array1[0][0]][array1[0][1]];
// 遍历打印出来的稀疏数组array1
for (int i = 1; i <array1.length ; i++) {
array2[array1[i][0]][array1[i][1]] = array1[i][2];
}
print(array2);
}
输出结果为: