稀疏数组可以针对大的二维数组做数据压缩存储,比如类棋盘这种含有大量重复数据的二维数组;
稀疏数组类 SparseArray.java
/**
* @Author: ltx
* @Date: 2021/3/29
* @Description: 稀疏数组
*/
public class SparseArray {
/**
* 打印二维数组
*
* @param arr 二维数组
*/
private static void printTwoDimension(int[][] arr) {
for (int[] row : arr) {
for (int val : row) {
System.out.printf("%d\t", val);
}
System.out.println();
}
}
/**
* 二维数组转稀疏数组
*
* @param twoDimension
*/
private static int[][] twoDimensionToArray(int[][] twoDimension) {
//记录有几个非0值
int count = 0;
//这里假设二维数组的列的长度都一样,所以直接取了0的长度
for (int i = 0; i < twoDimension.length; i++) {
for (int j = 0; j < twoDimension[0].length; j++) {
if (twoDimension[i][j] != 0) {
count++;
}
}
}
//初始化稀疏数组,+1是因为第一行要存原始二维数组的维度
int[][] sparseArray = new int[count + 1][3];
sparseArray[0][0] = twoDimension.length;
sparseArray[0][1] = twoDimension[0].length;
//强迫症...这个值可以不用,直接拿稀疏数组的长度即可;
// sparseArray[0][2] = count;
count = 0;
for (int i = 0; i < twoDimension.length; i++) {
for (int j = 0; j < twoDimension[0].length; j++) {
if (twoDimension[i][j] != 0) {
count++;
sparseArray[count][0] = i;
sparseArray[count][1] = j;
sparseArray[count][2] = twoDimension[i][j];
}
}
}
return sparseArray;
}
/**
* 稀疏数组还原二维数组
*
* @param sparseArray
* @return
*/
private static int[][] arrayToTwoDimension(int[][] sparseArray) {
//创建二维数组
int[][] arr = new int[sparseArray[0][0]][sparseArray[0][1]];
//赋值
for (int i = 1; i < sparseArray.length; i++) {
arr[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2];
}
return arr;
}
public static void main(String[] args) {
int n = 10;
int m = 10;
System.out.println("初始化二维数组...");
//10*10二维数组
int[][] arr = new int[n][m];
//打印初始化的二维数组
printTwoDimension(arr);
//随便修改几个值
System.out.println("随便写几个值...");
arr[2][4] = 1;
arr[4][3] = 2;
arr[6][8] = 3;
arr[9][9] = 4;
//打印修改值之后的二维数组
printTwoDimension(arr);
System.out.println("二维数组-->稀疏数组...");
int[][] sparseArray = twoDimensionToArray(arr);
printTwoDimension(sparseArray);
System.out.println("稀疏数组-->二维数组...");
printTwoDimension(arrayToTwoDimension(sparseArray));
}
}