- 1 - 观看例子
- 2 - 引出问题
- 3 - 稀疏数组
- 4 - 二维数组与稀疏数组相互转换
- 思路
- 代码实现
大家都玩过五子棋吧,黑方或白方只要有一方棋子先连上五个就为胜利
棋盘与棋子如图:
那么转换为Java中的二维数组就为:
2 - 引出问题0:表示没有棋子
1:表示黑棋
2:表示白棋
3 - 稀疏数组可以看到二维数组中很多值都是 0,因此记录了很多没有意义的数据。
当一个二维数组中 大部分元素为 0(或是同一个值) 时,可以使用 稀疏数组 来保存该数组
处理方法
- 记录数组一共有几行几列,有多少不同的值
- 把具有不同值元素 的行列值 记录在一个 小规模的数组 中,从而缩小程序的规模
如图:
图一:
图二:
4 - 二维数组与稀疏数组相互转换 思路图一是原始的二维数组 6x7 = 42 个格子,图二是稀疏数组 9 x 3 = 27 个格子
[0]:记录了棋盘的大小,6 行 7 列,棋盘上有 8 个不为 0 的值
其他行:分别记录每一个非 0 值的所在行、所在列、值
比如 [1]:在第 0 行第 3 列上有一个 22(这里的行列都是下标)
可以看到原始 42 个数据,压缩成 27 个数据。一定程度上压缩了数据。
二维数组转稀疏数组:
- 遍历原始的二维数组,得到有效个数sum
- 根据 sum 创建 稀疏数组 sparseArr = int[sum + 1][3]
- 将二维数据的有效数据存入到稀疏数组中(从第 2 行开始存储)
- 最后将棋盘大小和有效个数写入第一行
稀疏数组转二维数组:
- 读取第一行数据,根据棋盘大小,创建原始的二维数组 chessArr = int [11][11]
- 从第二行开始,将有效数据还原到原始数组中
package com.krismile.ghf.array;
public class SparseArray {
public static void main(String[] args) {
// 二维数组转稀疏数组
int[][] chessArray = new int[10][10];
chessArray[1][1] = 1;
chessArray[1][2] = 2;
chessArray[3][2] = 1;
chessArray[2][2] = 1;
chessArray[6][2] = 2;
System.out.println("原始数组:");
printlnChessArray(chessArray);
System.out.println("稀疏数组:");
int[][] sparseArray = chessToSparse(chessArray);
printlnChessArray(sparseArray);
System.out.println("恢复原始数组:");
int[][] chessArr = sparseToChess(sparseArray);
printlnChessArray(chessArr);
}
public static int[][] chessToSparse(int[][] chessArray) {
// 1. 遍历数组得到有效个数
int sum = 0;
for (int[] ints : chessArray) {
for (int chess : ints) {
if (chess != 0) {
sum++;
}
}
}
// 2. 创建稀疏数组
// 有一行为二维数组的 行 列 值 所以 + 1
int[][] sparseArray = new int[sum + 1][3];
// 3. 将二维数组有效数据存入到稀疏数组 (从第二行开始)
// 二维数组的行
int chessRow = chessArray.length;
// 二维数组的列
int chessCol = 0;
// 当前是第几个非0的数
int count = 0;
for (int i = 0; i < chessArray.length; i++) {
int[] rows = chessArray[i];
if (chessCol == 0) {
chessCol = rows.length;
}
for (int j = 0; j < rows.length; j++) {
int chess = rows[j];
if (chess != 0) {
count++;
sparseArray[count][0] = i;
sparseArray[count][1] = j;
sparseArray[count][2] = chess;
}
}
}
// 4. 补全第一行 (行 列 值)
sparseArray[0][0] = chessRow;
sparseArray[0][1] = chessCol;
sparseArray[0][2] = sum;
// 5. 返回稀疏数组
return sparseArray;
}
public static int[][] sparseToChess(int[][] sparseArray){
// 1. 创建原始二维数组
int[][] chessArray = new int[sparseArray[0][0]][sparseArray[0][1]];
// 2. 恢复数据
// 从1开始,读取第二行
for (int i = 1; i < sparseArray.length; i++) {
int[] rows = sparseArray[i];
chessArray[rows[0]][rows[1]] = rows[2];
}
// 3. 返回原始数组
return chessArray;
}
public static void printlnChessArray(int[][] chessArray){
for (int[] ints : chessArray) {
for (int anInt : ints) {
System.out.printf("%-2dt", anInt);
}
System.out.println();
}
}
}
至此,稀疏数组就学完了,小伙伴们一定要多动手多思考哦!



