介绍
稀疏数组是一种数据结构,当一个较大的数组中大量元素都是0时,可以将它压缩为稀疏数组。
稀疏数组的格式为:
第0列 | 第1列 | 第2列 | |
第0行 | 原数组总行数 | 原数组总列数 | 原数组中非0元素个数 |
第1行 | 行数 | 列数 | 第一个非零元素 |
第2行 | 行数 | 列数 | 第二个非零元素 |
第...行 | 行数 | 列数 | 第..个非零元素 |
源码如下
//稀疏数组
public class Demo06 {
public static void main(String[] args) {
//声明并创建一个11*11的数组,相当于一个11*11的棋盘,两处分别落黑子和白子
int[][] array = new int[11][11];
array[1][2] = 1;
array[2][3] = 2;
//输出棋盘,该方法中使用了for each循环语句快捷地输出了二维数组
printTwoDimensionalArray(array);
//下面将上面的数组压缩为稀疏数组
int[][] array2 = generateSparseArray(array);
//打印稀疏数组
printTwoDimensionalArray(array2);
//将稀疏数组还原
int[][] array3 = restoreSparseArray(array2);
//打印还原后的数组
printTwoDimensionalArray(array3);
}
/**
* 该方法将任何一个二维数组压缩为稀疏数组并将其返回。
* @param array 二维数组
*/
public static int[][] generateSparseArray(int[][] array) {
//先判断传入的数组有几个不为0的元素
int sum = 0;
for (int[] ints : array) {
for (int anInt : ints) {
if (anInt != 0) {
sum++;
}
}
}
//声明并创建稀疏数组
int[][] array2 = new int[sum + 1][3];
//为稀疏数组按规则赋值
array2[0][0] = array.length;
array2[0][1] = array[0].length;
array2[0][2] = sum;
int temp = 1;
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[i].length; j++) {
if (array[i][j] != 0) {
array2[temp][0] = i;
array2[temp][1] = j;
array2[temp][2] = array[i][j];
temp++;
}
}
}
return array2;
}
/**
* 该方法用于打印任何二维数组
* @param array 二维数组
*/
public static void printTwoDimensionalArray(int[][] array) {
System.out.println("==================");
for (int[] ints : array) {
for (int anInt : ints) {
System.out.print(anInt+"\t");
}
System.out.println();
}
}
/**
* 该方法将传入的稀疏数组还原为正常的数组并将其返回。
* @param array2 稀疏数组
*/
public static int[][] restoreSparseArray(int[][] array2){
int[][] array3 = new int[array2[0][0]][array2[0][1]];
for (int i = 1; i < array2.length; i++) {
array3[array2[i][0]][array2[i][1]] = array2[i][2];
}
return array3;
}
}