二维数组:常用于储存地图(一些二D游戏,棋盘等),但在这些情况下使用二维数组时,二维数组中经常会有大量重复元素,其他数据在二维数组中所占比例能很小,当我们需要储存该二维数组时(例如游戏存档)就会出现大量的空间浪费,这时我们可以将二维数组转换为稀疏数组。
稀疏数组:固定为三列,行数为二维数组中特殊字符个数+1,第一行第一列存储二维数组行数,第一行第二列存储二维数组列数,第一行第三列存储二维数组特殊字符个数。
代码如下:
package com.wuhj.sparsearray;
/**
* 二维数组与稀疏数组相互转换
*
* @author wuhj
* @date 2020/6/19 11:40
*/
public class SparseArray {
public static void main(String[] args) {
//创建一个原始的二维数组 11*11
int[][] chessArr1 = new int[11][11];
chessArr1[1][2] = 1;
chessArr1[2][3] = 2;
chessArr1[2][5] = 2;
chessArr1[3][1] = 1;
System.out.println("模拟存档棋盘生成的二维数组:");
//输出原始二维数组
for (int[] row :chessArr1){
for (int data : row){
System.out.print(data+"\t");
}
System.out.println();
}
//将二维数组转稀疏数组
//1.遍历获取非0有效数据个数
int sum = 0;
for(int i = 0; i < chessArr1.length; i++) {
for(int j = 0; j < chessArr1.length; j++) {
if(chessArr1[i][j] != 0){
sum++;
}
}
}
//2建建对应稀疏数组
int[][] sparseArr = new int[sum + 1][3];
//给稀疏数组第一行赋值
sparseArr[0][0] = 11;
sparseArr[0][1] = 11;
sparseArr[0][2] = sum;
//遍历二维数组将非0的值存放到稀疏数组sparseArr中
//记录第几个非0数据
int count = 0;
for(int i = 0; i < chessArr1.length; i++) {
for(int j = 0; j < chessArr1.length; j++) {
if(chessArr1[i][j] != 0){
count++;
//非0数字所在行
sparseArr[count][0] = i;
//非0数字所在列
sparseArr[count][1] = j;
//非0数字本身
sparseArr[count][2] = chessArr1[i][j];
}
}
}
//输出稀疏数组
System.out.println("转换完成的稀疏数组:");
for(int i = 0; i < sparseArr.length; i++) {
//System.out.printf("%d\t%d\t%d\t\n",sparseArr[i][0],sparseArr[i][1],sparseArr[i][2]);
System.out.print(sparseArr[i][0]+"\t");
System.out.print(sparseArr[i][1]+"\t");
System.out.print(sparseArr[i][2]+"\t\n");
}
//读取稀疏数组第一行,根据第一行数字创建原始二维数组
int[][] chessArr2 = new int[sparseArr[0][0]][sparseArr[0][1]];
//读取稀疏数组后面几行数组,并赋值给 原始的二维数组
for (int i = 1; i < sparseArr.length; i++){
chessArr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
}
System.out.println("稀疏数组转换成二维数组:");
//输出恢复后的二维数组
for(int[] row :chessArr2) {
for(int data : row) {
System.out.print(data+"\t");
}
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 2 0 0 0 0 0
0 1 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 4
1 2 1
2 3 2
2 5 2
3 1 1
稀疏数组转换成二维数组:
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 2 0 0 0 0 0
0 1 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