一、应用场景
五子棋
使用二维数组保存五子棋当前棋子的位置
//生成一个8×8的棋盘,白子用1表示,黑子用2表示,没有放置棋子的位置用0表示
//第一个值为行,第二个值为列
int basicArray[][] = new int[8][8];
//三行四列为黑子
basicArray[2][3] = 2;
//四行五列为白子
basicArray[3][4] = 1;
//五行五列为黑子
basicArray[4][4] = 2;
//打印原始数组查看数据是否正确
System.out.println("原始数据");
for (int[] row : basicArray){
for (int result : row){
System.out.print(result+"\t");
}
System.out.println();
}
打印结果:
原始数据
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 2 0 0 0 0
0 0 0 0 1 0 0 0
0 0 0 0 2 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
二、二维数组转稀疏数组
1.计算需要存储的数据条数
//存放需要存储的数据条数
int sum = 0;
for(int[] row : basicArray){
for (int result : row){
if(result!=0){
sum++;
}
}
}
System.out.println("需要保存的数据条数:"+sum);
打印结果
需要保存的数据条数:3
2.创建稀疏数组
//sum加上第一条存储原数组基本信息行
int sparseArray[][] = new int[sum+1][3];
3.向稀疏数组中添加数据
//添加原始数组信息
//存储行数
sparseArray[0][0] = basicArray.length;
//存储列数
sparseArray[0][1] = basicArray[0].length;
//存储数据条数
sparseArray[0][2] = sum;
//添加所需数据信息
int count = 0;
for (int i = 0; i<sparseArray[0][0];i++){
for (int j = 0;j < sparseArray[0][1];j++){
if(basicArray[i][j]!=0){
//先进行自增,避免覆盖稀疏数组第一条基础信息
count++;
sparseArray[count][0] = i;
sparseArray[count][1] = j;
sparseArray[count][2] = basicArray[i][j];
}
}
}
System.out.println();
//输出稀疏数组
System.out.println("稀疏数组输出:");
for(int i=0;i<sparseArray.length;i++) {
System.out.printf("%d\t%d\t%d\n",sparseArray[i][0],sparseArray[i][1],sparseArray[i][2]);
}
输出内容:
稀疏数组输出:
8 8 3
2 3 2
3 4 1
4 4 2
二维数组转稀疏数组完成
第一行为二维数组的基础数据,8行8列三条数据
剩下三行为二维数组中的非0数据
三行四列的值为2
四行五列的值为1
五行五列的值为2
tips:数组下标从0开始
三、稀疏数组转二维数组
1.创建接收数据的二维数组
//导出二维数组基本信息
int rowNum = sparseArray[0][0];
int colNum = sparseArray[0][1];
//创建二维数组
int resultArray[][] = new int[rowNum][colNum];
2.向填入二维数组有效数据
//填入二维数组有效数据
for (int i = 1;i<=sparseArray[0][2];i++){
int row = sparseArray[i][0];
int col = sparseArray[i][1];
int result = sparseArray[i][2];
resultArray[row][col]= result;
}
3.输出结果
//输出二维数组
System.out.println("经过转换的结果数据");
for (int[] row : resultArray){
for (int result : row){
System.out.print(result+"\t");
}
System.out.println();
}
输出结果:
经过转换的结果数据
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 2 0 0 0 0
0 0 0 0 1 0 0 0
0 0 0 0 2 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
看懂二维数组与稀疏数组的互相转换过程了嘛
附完整代码:
public static void main(String[] args) {
//生成一个8×8的棋盘,白子用1表示,黑子用2表示,没有放置棋子的位置用0表示
//第一个值为行,第二个值为列
int basicArray[][] = new int[8][8];
//三行四列为黑子
basicArray[2][3] = 2;
//四行五列为白子
basicArray[3][4] = 1;
//五行五列为黑子
basicArray[4][4] = 2;
//打印原始数组查看数据是否正确
System.out.println("原始数据");
for (int[] row : basicArray){
for (int result : row){
System.out.print(result+"\t");
}
System.out.println();
}
//存放需要存储的数据条数
int sum = 0;
for(int[] row : basicArray){
for (int result : row){
if(result!=0){
sum++;
}
}
}
System.out.println("需要保存的数据条数:"+sum);
//创建稀疏数组
int sparseArray[][] = new int[sum+1][3];
//向稀疏数组中添加数据
//添加原始数组信息
//存储行数
sparseArray[0][0] = basicArray.length;
//存储列数
sparseArray[0][1] = basicArray[0].length;
//存储数据条数
sparseArray[0][2] = sum;
//添加所需数据信息
int count = 0;
for (int i = 0; i<sparseArray[0][0];i++){
for (int j = 0;j < sparseArray[0][1];j++){
if(basicArray[i][j]!=0){
//先进行自增,避免覆盖稀疏数组第一条基础信息
count++;
sparseArray[count][0] = i;
sparseArray[count][1] = j;
sparseArray[count][2] = basicArray[i][j];
}
}
}
System.out.println();
//输出稀疏数组
System.out.println("稀疏数组输出:");
for(int i=0;i<sparseArray.length;i++) {
System.out.printf("%d\t%d\t%d\n",sparseArray[i][0],sparseArray[i][1],sparseArray[i][2]);
}
//稀疏数组转二维数组
//导出二维数组基本信息
int rowNum = sparseArray[0][0];
int colNum = sparseArray[0][1];
//创建二维数组
int resultArray[][] = new int[rowNum][colNum];
//填入二维数组有效数据
for (int i = 1;i<=sparseArray[0][2];i++){
int row = sparseArray[i][0];
int col = sparseArray[i][1];
int result = sparseArray[i][2];
resultArray[row][col]= result;
}
//输出二维数组
System.out.println("经过转换的结果数据");
for (int[] row : resultArray){
for (int result : row){
System.out.print(result+"\t");
}
System.out.println();
}
}