
代码示例
/**
* 生成稀疏数组
* @param arr 原数组
* @param defaultValue 数组默认值
* @return
*/
static int[][] extractArray(int[][] arr, int defaultValue) {
// 统计有多少个非默认值
int count = 0;
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
if(arr[i][j] != defaultValue){
count++;
}
}
}
// 声明稀疏数组
int[][] sparseArr = new int[count + 1][3];
sparseArr[0][0] = arr.length;
sparseArr[0][1] = arr[0].length;
sparseArr[0][2] = count;
// 向稀疏数组填入数据
int index = 1;
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
if(arr[i][j] != defaultValue){
sparseArr[index][0] = i;
sparseArr[index][1] = j;
sparseArr[index][2] = arr[i][j];
index++;
}
}
}
return sparseArr;
}
/**
* 稀疏数组还原为二维数组
* @param arr 稀疏数组
* @return
*/
static int[][] sparseDilution(int[][] arr, int defaultValue) {
int[][] dilutionArr = new int[arr[0][0]][arr[0][1]];
// 先填充好默认值
for (int i = 0; i < dilutionArr.length; i++) {
for (int j = 0; j < dilutionArr[i].length; j++) {
dilutionArr[i][j] = defaultValue;
}
}
// 再解析出非默认值的坐标,覆盖值
for (int i = 1; i < arr.length; i++) {
dilutionArr[arr[i][0]][arr[i][1]] = arr[i][2];
}
return dilutionArr;
}
/**
* 打印二维数组
* @param arr 二维数组
*/
static void printArray(int[][] arr){
for (int[] ints : arr) {
for (int anInt : ints) {
System.out.print("\t" + anInt);
}
System.out.println();
}
}
public static void main(String[] args) {
// 定义原数组,五子棋盘15×15 0空1黑2白
int[][] arr = new int[15][15];
arr[7][7] = 1;
arr[7][8] = 1;
arr[8][8] = 2;
arr[9][9] = 2;
// 输出原数组
System.out.println("原数组为:");
printArray(arr);
// 调用方法,生成稀疏数组
int[][] sparseArr = extractArray(arr, 0);
// 输出稀疏数组
System.out.println("稀疏数组为:");
printArray(sparseArr);
// 调用方法,将稀疏数组还原为原数组
int[][] dilutionArr = sparseDilution(sparseArr, 0);
// 输出还原数组
System.out.println("还原数组为:");
printArray(dilutionArr);
}