稀疏数组
第一行记录原始二维数组的行数、列数和有效数据个数,为三列数据
第二行开始记录有效数据在二维数组中的位行,列和其值。
应用实例:五子棋棋盘的存盘
二维数组与稀疏数组相互转换思路
1、二维数组转为稀疏数组的思路:
①、遍历二维数组,记录有效数据个数sum
②、根据sum创建稀疏数组(行为sum+1,列为3)
③、将二维数组的数据存入稀疏数组
2、稀疏数组转为二维数组的思路:
①、先读取稀疏数组第一行数据,创建原始的二维数组
②、读取稀疏数组后几行数组,并赋值二维数组
具体代码实现
public class SparseArray {
public static void main(String[] args) {
/*创建一个棋盘原始数组*/
//棋盘数组,无子为0,黑子1,白子2
int chessArr[][] = new int[11][11];
chessArr[1][2] = 1;
chessArr[2][3] = 2;
//输出原始的数组
System.out.println("创建一个原始数组:");
for (int[] row : chessArr) {
for (int data : row) {
System.out.printf("%d\t", data);
}
System.out.println();
}
/*将二维数组转为稀疏数组*/
//1、获取原始数组中有效数据的个数
int sum = 0;//需要赋初始值
for (int i = 0; i < 11; i++) {
for (int j = 0; j < 11; j++) {
if (chessArr[i][j] != 0) {
sum++;
}
}
}
//2、创建对应的稀疏数组
int parseArr[][] = new int[sum + 1][3];
//3、给稀疏数组赋值 遍历二维数组
parseArr[0][0] = 11;
parseArr[0][1] = 11;
parseArr[0][2] = sum;
int count=0;
for (int i = 0; i < 11; i++) {
for (int j = 0; j < 11; j++) {
if (chessArr[i][j] != 0) {
count++;
parseArr[count][0]=i;
parseArr[count][1]=j;
parseArr[count][2]=chessArr[i][j];
}
}
}
//输出稀疏数组
System.out.println();
System.out.println("得到的稀疏数组为:");
for(int i=0;i<parseArr.length;i++){
System.out.printf("%d\t%d\t%d\t\n",parseArr[i][0],parseArr[i][1],parseArr[i][2]);
}
/*将稀疏数组还原为原始数组*/
//1、先读取第一行数据,创建原始数组
int chessArr1[][]=new int[parseArr[0][0]][parseArr[0][1]];
//2、读取后几行的数据,并给原始数组赋值
for(int i=1;i<parseArr.length;i++){
chessArr1[parseArr[i][0]][parseArr[i][1]]=parseArr[i][2];
}
//3、输出原始数组
System.out.println();
System.out.println("得到的原始数组为:");
for (int[] row : chessArr1) {
for (int data : row) {
System.out.printf("%d\t", data);
}
System.out.println();
}
}
}