## 稀疏数组(棋盘类必备)

package com.joseph.sparseArray;
public class SparseArray {
public static void main(String[] args) {
//创建11*11的棋盘
//0表示棋子。1表示黑子。2表示白子
int chessArr1[][] = new int[11][11] ;
chessArr1[1][2] = 1 ;//第二行第三列是1;
chessArr1[2][3] = 2 ;//第三行第四列是2;
chessArr1[3][4] = 3 ;//第四行第五列是3;
for(int arr[] : chessArr1){
for(int arrKey:arr) {
System.out.print(arrKey + "、");
}
System.out.println();
}
/**
* 将二维数组变为稀疏数组
*/
//获取原二维数组非0值个数
int count = 0 ;
for(int arr[]:chessArr1){
for (int e:arr){
if(e!=0){
count++;
}
}
}
//创建稀疏数组并初始化第一行的值
int sparseArr[][] = new int[count+1][3];
int index = 0 ;
sparseArr[0][0] = chessArr1.length;
sparseArr[0][1] = chessArr1[0].length;
sparseArr[0][2] = count;
//给稀疏数组第二行开始赋值
for(int i = 0 ; i <chessArr1.length; i++){
for (int j = 0 ; j <chessArr1[i].length;j++){
if (chessArr1[i][j]!=0){
//第一列是非0值所在的列数
sparseArr[index+1][0] = i+1 ;
//第二列是非0值所在的行数
sparseArr[index+1][1] = j+1 ;
//第三列是非0值的值
sparseArr[index+1][2] = chessArr1[i][j];
index ++ ;
}
}
}
System.out.println("---------------------------------------");
//输出稀疏数组
for(int sArr[]:sparseArr){
for(int s:sArr){
System.out.print(s+",");
}
System.out.println();
}
// System.out.println(chessArr1[0].length);
}
}
/**
* @author JosephWang
* @date 2021/7/24 15:43
*/
这里的行数和列数为了更加清晰。我们加1处理。为了直接知道第几行第几列
而真正的行列数是从0开始。
这样就成功地把二维数组转换为稀疏数组。如果要用这个二维数组。再将它继续转化。原理是利用数组中元素代表着行数列数和具体的值。拿出来可以用上。具体代码如下
//稀疏数组转二维数组
//还原二维数组初始化
int row = sparseArr[0][0] ;
int col = sparseArr[0][1] ;
// System.out.println(row + "," + col);
int chessArr2[][] = new int[row][col] ;
//放入非零的值
for(int a = 1 ; a<sparseArr.length;a++){
for(int b = 0 ; b < sparseArr[0].length;b++){
//拿到行数
int resultRow = sparseArr[a][b];
b++;
//拿到列数
int resultCol = sparseArr[a][b];
b++;
//拿到非零值
int result = sparseArr[a][b] ;
//赋值给二维数组
chessArr2[resultRow][resultCol] = result ;
}
}
//输出二位数组
for (int reduction[] :chessArr2){
for(int reductionKey : reduction){
System.out.print(reductionKey + "、");
}
System.out.println();
}
}

# 我们发现好像行数列数有点问题。是因为上边的稀疏数组为了直观表明原数组的值的行列数。我们加一处理了。但并不影响我们还原成功。实际上大家应用的时候。不要加一。因为数组下标从0开始。计算机可不需要直观的表现。
## 这样我们就完成了稀疏数组的编程