稀疏数组的介绍:当一个数组中大部分的数据都为0或同一个值时我们可以使用稀疏数组来保存这个数组;
就好比我们的棋盘,他可以看成为一个二维数组,但这给棋盘上有的大部分的位置是没有棋子的。将他转为二维数组来储存时就有点浪费了,我们可以按照稀疏数组来储存棋盘上的数据。
稀疏数组的处理方式:
1.纪录数组一个有多少行多少列多少个值。
2.把具有不同值的元素纪录在小规模的数组中,从而缩小程序的规模。
我们可以将一个二维数组转换为如右一样的稀疏数组。
代码介绍:
// 先创建一个二维数组
// 0代表没有旗子1代表黑棋2代表白棋
int[][] arr = new int[11][11];
arr[5][5] = 1;
arr[6][6] = 2;
for (int[] row : arr) {
for (int a : row) {
System.out.print(a);
}
System.out.println();
}
// 将二维数组转为稀疏数组
// 先定义一个数来纪录有多少个不为0的数
int sum = 0;
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
if (arr[i][j] != 0) {
sum++;
}
}
}
System.out.println("sum=" + sum);
// 创建稀疏数组
int[][] SparseArray = new int[sum + 1][3];
// 给稀疏数组赋值
SparseArray[0][0] = 11;
SparseArray[0][1] = 11;
SparseArray[0][2] = sum;
// 定义一个计数器来计算这是第几个非零数据好保存在稀疏数组的第几行;
int count = 0;
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
if (arr[i][j] != 0) {
count++;
SparseArray[count][0] = i;
SparseArray[count][1] = j;
SparseArray[count][2] = arr[i][j];
}
}
}
// 打印稀疏数组
System.out.println("打印后的稀疏数组");
for(int[] row:SparseArray){
for(int a:row){
System.out.print(a+" ");
}
System.out.println();
}
// 将稀疏数组恢复成为二维数组
// 按照稀疏数组的第一列中储存的数据来创建一个二维数组 一维的长度为稀疏数组的第一行的第一列的值
// 二维的长度为稀疏数组的第一行的第二列的值
int[][] arr2 = new int[SparseArray[0][0]][SparseArray[0][1]];//此时这个二维数组还只是空的
// 现在将数据添加
for (int i=1;i<SparseArray.length;i++){
arr2[SparseArray[i][0]][SparseArray[i][1]]=SparseArray[i][2];
}
System.out.println("恢复完后的二维数组");
for(int[] row:arr2){
for(int a:row){
System.out.print(a);
}
System.out.println();
}