使用场景
当一个数组中大部分元素为0或者同一个相同的值时, 便可以使用稀疏数组。
稀疏数组元素结构
- 记录指定数组一共有几行几列及有多少个不同的值(有效值)
- 将具有不同值的元素的行列及值记录在一个小规模的数组中, 从而缩小数据来达到压缩的目的(压缩后的数据可用于存取等功能)
二维数组(原始数据)转换稀疏数组的思路
- 遍历原数组, 获取有效值个数 sum
- 根据 sum, 锁定稀疏数组的行数 int sparseArr[][] = new int[sum + 1][3]; 其中+1是因为多一行用于记录原数组的行列及有效值个数
- 将有效值存到稀疏数组
稀疏数组转换原数组的思路
- 读取稀疏数组的第一行, 创建原数组 int[][] chessArr2 = new int[sparseArr[0][0]][sparseArr[0][1]];
- 再将稀疏数组的其它数据, 赋值给原数组 chessArr2
实例代码
public class SparseArrayApp {
public static void main(String[] args) {
/** 锁定原数组的行数与列数*/
int rows = 4;
int columns = 5;
/** 创建二维数组(原始数据)*/
int[][] chessArray1 = new int[rows][columns];
/** 原数据, 插入几个有效值*/
chessArray1[1][1] = 1;
chessArray1[1][2] = 2;
chessArray1[2][2] = 4;
/** 输出原数组*/
System.out.println("原数组:");
for (int[] row : chessArray1) {
for (int data : row) {
System.out.print(data + " ");
}
System.out.println();
}
/** 1. 遍历原数组, 获取有效值个数 sum*/
int sum = 0;
for (int i = 0; i < chessArray1.length; i++) {
for (int j = 0; j < chessArray1[i].length; j++) {
if (chessArray1[i][j] != 0) {
sum++;
}
}
}
System.out.println("有效值个数: " + sum);
System.out.println();
/** 2. 根据 sum, 创建稀疏数组*/
int sparseArr[][] = new int[sum + 1][3];
/** 第一行设定原数组的行数列数及有效值个数*/
sparseArr[0][0] = rows;
sparseArr[0][1] = columns;
sparseArr[0][2] = sum;
/** 遍历二维数组,将非0的值存放到稀疏数组中*/
int count = 0;
for (int i = 0; i < rows; i++) {
for (int j = 0; j < columns; j++) {
if (chessArray1[i][j] != 0) {
count++;
sparseArr[count][0] = i;
sparseArr[count][1] = j;
sparseArr[count][2] = chessArray1[i][j];
}
}
}
/** 输出稀疏数组的存储形式*/
System.out.println("稀疏数组:");
for (int i = 0; i < sparseArr.length; i++) {
System.out.printf("%d\t%d\t%d\t\n", sparseArr[i][0], sparseArr[i][1], sparseArr[i][2]);
}
/** 稀疏数组转换原数组*/
/** 1. 读取稀疏数组的第一行, 创建原数组*/
int[][] chessArr2 = new int[sparseArr[0][0]][sparseArr[0][1]];
/** 2. 再将稀疏数组的其它数据, 赋值给原数组 chessArr2*/
for (int i = 1; i < sparseArr.length; i++) {
chessArr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
}
/** 输出新创建的原数组 chessArr2*/
System.out.println();
System.out.println("新的原数组:");
for (int[] row : chessArr2) {
for (int data : row) {
System.out.print(data + " ");
}
System.out.println();
}
}
}
> 原数组:
> 0 0 0 0 0
> 0 1 2 0 0
> 0 0 4 0 0
> 0 0 0 0 0
> 有效值个数: 3
>
> 稀疏数组:
> 4 5 3
> 1 1 1
> 1 2 2
> 2 2 4
>
> 新的原数组:
> 0 0 0 0 0
> 0 1 2 0 0
> 0 0 4 0 0
> 0 0 0 0 0