基本介绍
当一个数组中大部分元素为0,或为同一个元素时,可以使用稀疏数组来保存该数组
处理方法
- 记录数组一共有几行几列,有多少个不同的数值
- 把具有不同值的行列及值记录在一个小规模的数组中,从而缩小程序的规模
应用实例
- 使用稀疏数组,来保留类似二维数组(棋盘、地图等待)
- 把稀疏数组存盘,并且可以重新恢复原来的二维数组
二维数组转稀疏数组
- 遍历原始二维数组,得到有效数据的个数sum
- 根据sum创建稀疏数组 sparseArray int[sum+1][3]
- 将二维数组的有效数据数据存入到稀疏数组
稀疏数组转原始二维数组的思路
- 先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组
- 在读取稀疏数组的后几行的数据,并赋值给原始的二维数组
代码
public class AgingSparseArray {
/**
* 二维数组与稀疏数组的相互转换
* @author DeadAndLive
* @date 2020-08-05 19:28
*/
public static void main(String[] args) {
int[][] twoArray = createTwoArray(10, 20);
twoArray[1][1] = 1;
twoArray[2][2] = 2;
twoArray[5][5] = 1;
twoArray[7][8] = 2;
traverseArray(twoArray);
int twoArrayValueNumber = getTwoArrayValueNumber(twoArray);
int[][] sparseArray = formTwoArrayToSparseArray(twoArray, twoArrayValueNumber);
traverseArray(sparseArray);
int[][] sparseArrayToTwoArray = formSparseArrayToTwoArray(sparseArray);
traverseArray(sparseArrayToTwoArray);
}
/**
* 根据row和col创建一个二维数组
* @param row 行数
* @param col 列数
* @return 二维数组
*/
public static int[][] createTwoArray(int row, int col) {
return new int[row][col];
}
/**
* 传入一个原始二维数组和原始二维数组的不等于0的value的个数,返回一个稀疏数组
* @param towArray 二维数组
* @param valueNumber 二维数组的总不等于0的value的个数
* @return 稀疏数组
*/
public static int[][] formTwoArrayToSparseArray(int[][] twoArray,int valueNumber) {
int[][] sparseArray = new int[valueNumber+1][3];
sparseArray[0][0] = twoArray.length;
sparseArray[0][1] = twoArray[1].length;
sparseArray[0][2] = valueNumber;
int sparseNumber = 0;
for (int i = 0; i < twoArray.length; i++) {
for (int j = 0; j < twoArray[1].length; j++) {
if (twoArray[i][j] != 0) {
sparseNumber++;
sparseArray[sparseNumber][0] = i;
sparseArray[sparseNumber][1] = j;
sparseArray[sparseNumber][2] = twoArray[i][j];
}
}
}
return sparseArray;
}
/**
* 根据传入的二维数组,返回这个二维数组的不等于0的value的个数
* @param twoArray 二维数组
* @return value的个数
*/
public static int getTwoArrayValueNumber(int[][] twoArray) {
int number = 0;
for (int[] ints : twoArray) {
for (int anInt : ints) {
if (anInt != 0) {
number++;
}
}
}
return number;
}
/**
* 格式化遍历一个二维数组
* @param array 二维数组
*/
public static void traverseArray(int[][] array) {
for (int[] ints : array) {
for (int anInt : ints) {
System.out.printf("%d\t",anInt);
}
System.out.println();
}
}
/**
* 将稀疏数组转换为二维数组
* @param sparseArray 稀疏数组
* @return 二维数组
*/
public static int[][] formSparseArrayToTwoArray(int[][] sparseArray) {
int[][] array = new int[sparseArray[0][0]][sparseArray[0][1]];
for (int i = 1; i < sparseArray.length; i++) {
array[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2];
}
return array;
}
}