稀疏数组
一、稀疏数组定义:
稀疏数组是一种二维数组。当在二维数组中存在较多的无效值如0的时候,我们可以考虑采用稀疏数组以节省空间。
二、需求:
解决二维数组很多默认值0
三、处理方式:
- 记录数组一共有几行几列,有多少个不同值
- 把具有不同值的元素和行列及值记录在一个小规模的数组中,从而缩小程序的规模.
四、案例:
1.解决棋盘退出保存问题
0:表示没有棋子 1:表示黑棋 2:表示白棋
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cEi7Ta3k-1666435091451)(C:\Users\hp\Desktop\稀疏数组的照片\QQ截图20221022181635.png)]
public class StudySparseArray {
public static void main(String[] args) {
//打印棋盘 0:表示没有棋子 1:表示黑棋 2:表示白棋
int[][] arr = new int[8][8];
//给二维数组arr赋值
arr[0][2] = 1;
arr[2][1] = 2;
arr[3][1] = 1;
arr[3][2] = 2;
System.out.println("棋盘: ");
print(arr);//调用print方法来答应结果
int sum = 0;//用来记录有多少个有效值,为了后面来确定稀疏数组的行数
for (int i = 0; i < arr.length; i++) {//对数组arr的行来进行循环遍历
for (int j = 0; j < arr[i].length; j++) {//对arr行的每列值进行循环遍历
if (arr[i][j] != 0){//如果值不等于0,sum进行加1,
sum++;//为了后面记录稀疏数组的行数
}
}
}
System.out.println("有效值sum: " + sum);
System.out.println("===================");
System.out.println("稀疏数组: ");
//稀疏数组
int[][] arr1 = new int[sum+1][3];//因为稀疏数组的第一行是来记录总体的行列及值的个数,所以sum+1
arr1[0][0] = 8;//给第一行的值进行赋值
arr1[0][1] = 8;
arr1[0][2] = sum;
int count = 0;
for (int i = 0; i < arr.length;i++){//循环数组arr的行数
for (int j = 0; j < arr[i].length; j++) {//循环数组arr的列数;
if (arr[i][j] != 0){
count++;//因为稀疏数组是每个值为一行,所以可以用count来为稀疏数组添加值!
arr1[count][0] = i;//记录了该值在二维数组的第几行
arr1[count][1] = j;//记录了该值在二维数组的第几列
arr1[count][2] = arr[i][j];//记录了该值有效值是多少
}
}
}
print(arr1);
System.out.println("========================");
System.out.println("还原稀疏数组: ");
int[][] arr2 = new int[arr1[0][0]][arr1[0][1]];
for (int i = 1; i < arr1.length; i++) {//因为稀疏数组的第一行记录的值是表的总行数跟列数,第二行开始才记录的是有效值的行数,列数,以及值是多少;
//如果是0 就会报错(数组下标指针溢出异常):因为我们创建的arr2数组行和列都是8,且arr1[0][0]=8
// arr1[0][1]=8,arr2[arr1[i][0]][arr1[i][1]]=arr2[8][8],这个代表着arr2第9行第9列
//数组的下标是从0开始的,所以会出现指针溢出异常!
arr2[arr1[i][0]][arr1[i][1]] = arr1[i][2];
}
print(arr2);
}
//用二维数组的foreach来遍历打印该数组
public static void print(int[][] arr){
for (int[] ints : arr){
for (int anInt : ints){
System.out.print(anInt + "\t");
}
System.out.println();
}
}
}
2.结果图
}
System.out.println();
}
}
}
### 2.结果图
