稀疏数组
- 需求:编写五子棋游戏中,有存盘退出和续上盘的功能。
-
分析问题:因为该二维数组的很多值是默认值0,因此记录了很多没有意义的数据。
-
解决:稀疏数组
-
数组中大部分为同一值的数组时,可用稀疏数组来保存。
-
稀疏数组的处理方式是:
1、记录数组一共有几行几列,有多少个不同值
2、把具有不同值的元素和行列及值记录在一个小规模的数组中,用来缩小程序规模
如下图:左边是原始数组,右边是稀疏数组
-
稀疏数组实例
public class B9XiShuShuZu {
public static void main(String[] args) {
/**
* 1.创建一个二维数组 11*11 0 无子 1 黑子 2 白子
*/
int[][] arr = new int[11][11];
arr[1][2] = 1;
arr[2][3] = 2;
/**
* 输出原始稀疏数组
*/
pullErWeiShuZu(arr);
System.out.println("=================");
/**
* 转换为稀疏数组储存
* 保留有效值的个数
*/
int count = 0;
for (int[] arr1:arr){
for (int b:arr1){
if (b!=0){
count++;
}
}
}
System.out.println("有效数值有"+count+"个");
System.out.println("=================");
/**
* 创建一个稀疏数组的数组
*/
int[][] arrXi = new int[count+1][3]; //稀疏数组 有记录数组 11 行,11 列的首行
arrXi[0][0] = 11; // 11行
arrXi[0][1] = 11; // 11列
arrXi[0][2] = count; // 有效值个数
/**
* 输出稀疏数组
*/
pullErWeiShuZu(arrXi);
/**
* 遍历二维数组,将非零值,存放在稀疏数组中
*/
int count1 = 1;
for (int i= 0;i<arr.length;i++){
for (int j= 0;j<arr[i].length;j++){
if(arr[i][j] != 0){
//从第二行开始放置
arrXi[count1][0]=i; //有效值的行坐标
arrXi[count1][1]=j; //有效值的列坐标
arrXi[count1][2]=arr[i][j]; //有效值的数值
count1++;
}
}
}
System.out.println("=================");
/**
* 输出稀疏数组
*/
pullErWeiShuZu(arrXi);
System.out.println("=================");
/**
* 还原稀疏数组
*/
int[][] arrHuanYuan = new int[arrXi[0][0]][arrXi[0][1]];
for(int i= 1;i<arrXi.length;i++){
arrHuanYuan[arrXi[i][0]][arrXi[i][1]] = arrXi[i][2];
}
pullErWeiShuZu(arrHuanYuan);
}
/**
* 遍历二维数组
* @param arr
*/
public static void pullErWeiShuZu(int[][] arr){
for (int[] arr1:arr){
for (int b:arr1){
System.out.print(b+"\t");
}
System.out.println();
}
}
/**
* 统计有效值个数
* @param arr
* @return
*/
public static int tongJiYouXiaoZhi(int[][] arr){
int count = 0;
for (int[] arr1:arr){
for (int b:arr1){
if (b!=0){
count++;
}
}
}
System.out.println("有效数值有"+count+"个");
return count;
}
}