稀疏的概述
当一个数组中大部分元素为0,或者为同一值的数组时,可以使用稀疏数组来保存该数组。
稀疏数组的处理方式是:
记录数组一共有几行几列,有多少个不同值
把具有不同值的元素和行列及值记录在一个小规模的数组中,从而缩小程序的规模
如下图: 左边是原始数组,右边是稀疏数组
初始化左边的数组
// 创建一个二维数组 6 * 7 0代表没有赋值
int[][] array1 = new int[6][7];
array1[0][3] = 22;
array1[0][6] = 15;
array1[1][1] = 11;
array1[1][5] = 17;
array1[2][3] = -6;
array1[3][5] = 39;
array1[4][0] = 91;
array1[5][2] = 28;
// 这是增强for循环 将array1里面的值直接赋值给ints
for (int[] ints : array1) {
for (int anInt : ints) {
System.out.print(anInt + "\t");
}
System.out.println();
}
从二维数组变成稀疏数组
// 声明一个变量 用来记录上面二维数组中一共有多少个值
int sum = 0;
for (int i = 0; i < 6; i++){
for (int j = 0; j < 7; j++){
if (array1[i][j] != 0){
sum++;
}
}
}
// 初始化右边的稀疏数组
int[][] array2 = new int[sum + 1][3];
array2[0][0] = 6;
array2[0][1] = 7;
array2[0][2] = sum;
System.out.print("行" + "\t" + "列" + "\t" + "值");
int count = 0;
for (int i = 0; i < array1.length; i++) {
for (int j = 0; j < array1[i].length; j++) {
if (array1[i][j] != 0) {
count++;
array2[count][0] = i;
array2[count][1] = j;
array2[count][2] = array1[i][j];
}
}
}
for (int i = 0; i < array2.length; i++) {
System.out.println(array2[i][0] + "\t" + array2[i][1] + "\t" + array2[i][2])
}
从稀疏数组变成二维数组
// 初始化二维数组
int[][] array3 = new int[array2[0][0]][array2[0][1]];
// 由于第一行的值是用来记录整个数组长宽及有几个不同数的 所以i初始值为1
for (int i = 1; i < array2.length; i++) {
array3[array2[i][0]][array2[i][1]] = array2[i][2];
}
for (int[] ints : array3) {
for (int anInt : ints) {
System.out.print(anInt + "\t");
}
System.out.println();
}