稀疏数组介绍:
当一个数组中大部分元素是0,或者为同一个值的数组的时候,可以使用稀疏数组来保存该数组。
处理方法:
- 记录数组一共有几行几列,有多少个不同的值
- 把具有不同的值的元素的行列值记录在一个小规模的数组中,从而缩小程序的规模
举例说明:
注:第一行指的是数组为6行7列,有效数据有8个的数组。压缩后的数组为9*3。
应用场景举例:
例如:五子棋程序中,有存盘退出和续上盘的功能。
思路分析:
二维数组转稀疏数组:
- 遍历原始的二维数组,得到有效数据个数
- 根据个数创建稀疏数组
- 将有效数据放入稀疏数组
稀疏数组转二维数组:
- 先读取稀疏数组的第一行,根据第一行的内容创建二维数组
- 在读取稀疏数组后面几行的内容,将数据写入二维数组
代码实现:
package com.jun.sparsearray;
/**
* 稀疏数组代码实现
*
* @author jun
*
*/
public class Test_SparseArray {
public static void main(String[] args) {
// 1、创建一个原始的二维数组,0表示没有棋子,1表示黑子,2表示白子
int chessArr[][] = new int[11][11];
chessArr[1][2] = 1;
chessArr[2][3] = 2;
// 2、输出原始二维数组
for (int[] row : chessArr) {
for (int data : row) {
System.out.printf("%d\t", data);// 格式输出
}
System.out.println();
}
// 3、二维数组转稀疏数组
int sum = 0;
for (int i = 0; i < chessArr.length; i++) {
for (int j = 0; j < chessArr[i].length; j++) {
if (chessArr[i][j] != 0) {
sum++;// 得到非0数据个数
}
}
}
// 4、创建对应的稀疏数组
int spareArr[][] = new int[sum + 1][3];
spareArr[0][0] = chessArr.length;
spareArr[0][1] = chessArr[0].length;
spareArr[0][2] = sum;
int count = 0;// 计数器(用于记录是第几个非0数据)
for (int i = 0; i < 11; i++) {
for (int j = 0; j < 11; j++) {
if (chessArr[i][j] != 0) {
count++;
spareArr[count][0] = i;
spareArr[count][1] = j;
spareArr[count][2] = chessArr[i][j];
}
}
}
// 5、查看稀疏数组
System.out.println();
System.out.println("稀疏数组为:");
for (int i = 0; i < spareArr.length; i++) {
System.out.printf("%d\t%d\t%d\t\n", spareArr[i][0], spareArr[i][1], spareArr[i][2]);
}
System.out.println();
// 6、稀疏数组恢复成二维数组
int chessArr2[][] = new int[spareArr[0][0]][spareArr[0][1]];
// 从稀疏数组的第二行开始遍历
for (int i = 1; i < spareArr.length; i++) {
// 稀疏数组的第i行的第1列、第2列、第三列分别是是二维数组值的行、列、值
chessArr2[spareArr[i][0]][spareArr[i][1]] = spareArr[i][2];
}
System.out.println();
System.out.println("恢复后的二维数组:");
for (int[] row : chessArr2) {
for (int data : row) {
System.out.printf("%d\t", data);
}
System.out.println();
}
}
}
输出结果:
0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0
0 0 0 2 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
稀疏数组为:
11 11 2
1 2 1
2 3 2
恢复后的二维数组:
0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0
0 0 0 2 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
注:
二维数组array[][]已定义。
获取二维数组的长度:array.length
获取二维数组的宽度:array[i].length