介绍
1.转换原因我们把围棋盘或者五子棋盘看做一个二维数组,当我们的棋子不够多时,其实很多值都是默认值0,我们为了节约空间,就会使用稀疏数组。
2.放弃转换 如果转换为稀疏数组会使得空间冗余,比如说,我一个10乘10的二维数组放满了棋子,我本来只需要10乘10,但是稀疏数组需要101*3.就没有必要。
思路
这就是二维数组和稀疏数组相互转换的图,然后大家可以跟着思路去自己先试着写一遍,因为这个实际上都还没涉及到算法,只是一个思路变换。(相信当你在看这个时候,你应该已经过了java基础阶段)
二维数组转稀疏数组
package com.etime11;
//二维数组和稀疏数组的相互转换
public class Test01 {
public static void main(String[] args) {
int[][]array=new int[11][11]; //创建一个二维数组当一个五子棋盘
array[2][3]=1; //1为黑子
array[3][4]=2; //2为白子
array[0][5]=1;
array[6][9]=2;
int len=array.length; //获取数组长度
System.out.println("查看建立好的五子棋盘");
int sum=0; //为了统计二维数组里面不为0的个数
for(int[] array1:array) {
for(int i:array1){
//System.out.printf("%d\t",i); //“\t”缩进 “\n”换行
System.out.print(i+"\t"); //为什么用"\t"呢,缩进,让格式更自然(如果是11)
//System.out.print(i+" "); //输出这个二维数组
if(i!=0) {
sum=sum+1;
}
}
System.out.println();//什么都不再添加进行换行(我加入一个参数(为空)以后再换行)
}
System.out.println("查看完毕");
System.out.println("棋盘上有"+sum+"个棋子");
System.out.println(); //换行
System.out.println("开始二维数组转稀疏数组");
System.out.println(".............");
int[][]array2=new int[sum+1][3]; //创建稀疏数组
array2[0][0]=11;
array2[0][1]=11;
array2[0][2]=sum; //先赋值二维数组第一行
int count=0; //为了稀疏数组的下标可以变化(第几行)
for(int i=0;i<len;i++) {
for(int j=0;j<len;j++) {
if(array[i][j]!=0) {
++count; //第几行的值,因为下标从0开始
array2[count][0]=i;
array2[count][1]=j;
array2[count][2]=array[i][j]; //对稀疏数组进行赋值
}
}
}
System.out.println("转换成功");
System.out.println("查看稀疏数组");
for(int[]arr:array2) {
for(int i:arr) {
System.out.print(i+"\t");
}
System.out.println();
}
System.out.println("完成稀疏数组的查看");
System.out.println(); //换行
}
}
稀疏数组转二维数组
建立在 上面的System.out.println(); //换行之后
System.out.println("稀疏数组返回到二维数组");
System.out.println("开始转换");
System.out.println("............");
int[][]array3=new int [array2[0][0]][array2[0][1]]; //从稀疏数组第一行得到行列创建二维数组
for(int i=1;i<sum+1;i++) {
array3[array2[i][0]][array2[i][1]]=array2[i][2]; //对二维数组进行赋值
}
System.out.println("转换成功");
System.out.println("开始查看原始二维数组");
for(int[]arr :array3) { //增强for循环输出二维数组
for(int i:arr) {
System.out.print(i+"\t");
}
System.out.println(); //换行
}
System.out.println("game over");