一:什么是稀疏数组?
稀疏数组说到底也是一种数组,只不过它表示的是对另一个数组数据的一种特殊表示。所谓的特殊表示就是把一个数组中的行数、列数、对应的具体的数值这三个值记录在另一个数组中,从而缩小了数组的规模。这样的被缩小规模后的数组成为稀疏数组。如图:
二:为什么需要稀疏数组?
为了节省内存节省资源,因此我们需要稀疏数组。
三:什么时候用稀疏数组?
当一个数组中大多数元素为同一个值的时候,那么这个数组中大多数具有相同值得元素我们一定要一一存储吗?这样做岂不是大大的浪费了空间。这个时候我们可以使用稀疏数组。
下面我们来具体看看稀疏数组的实用:
第一种:两二维数组转化为稀疏数组
1.遍历原始的数组,得到有效数据的个数sum;
2.根据sum的值创建稀疏数组int[sum+1][3](这里之所以sum+1,是因为我们的稀疏数组的第一行需要存储整个数组的信息,后面的行才记录原始数组的具体信息);
3.将二维数组的有效数据存入到稀疏数组中。
上代码:
首先定义二维数组:
chessArray[1][2] = 1;
chessArray[2][3] = 2;
//遍历输出二维数组
System.out.println("原始的二维数组为:");
for(int[] arr : chessArray){
for(int date : arr){
System.out.printf("%d ",date);
}
System.out.println();
}
这是打印的结果:
然后我们需要得到有效数据的个数并创建稀疏数组
//二维数组转为稀疏数组
//1.将二维数组遍历,得到非0数据的个数sum
//2.根据sum的值创建稀疏数组
//3.将二维数组的有效值存入稀疏数组中
int sum = 0;
for(int[] arr : chessArray){
for(int date : arr){
if(date != 0)
sum++;
}
}
System.out.println("sum=" + sum);
//创建稀疏数组
int[][] spareseArray = new int[sum + 1][3];
//给稀疏数组赋值
spareseArray[0][0] = 11; spareseArray[0][1] =11; spareseArray[0][2] = sum;
//遍历二维数组,将非0的值存入稀疏数组
int count = 0;//定义count,用于记录当前是第几个非0的数据
for(int i = 0;i < 11;i++){
for(int j = 0;j < 11;j++){
if(chessArray[i][j] != 0){
count++;
spareseArray[count][0] = i; //存放非0数据所在的行
spareseArray[count][1] = j; //存放非0数据所在的列
spareseArray[count][2] = chessArray[i][j];//存放非0数据的值
}
}
}
//稀疏数组的输出
System.out.println();
System.out.println("行 列 值");
for(int[] arr : spareseArray){
for(int date : arr){
System.out.printf("%-2d ",date);
}
System.out.println();
}
看完了二维数组转化为稀疏数组,我们也可以试着将稀疏数组转化为二维数组
1:先读取稀疏数组的第一行,根据读取的结果来创建二维数组
2:再读取后面的数据,将其复制给二维数组即可
上代码
//将稀疏数组恢复成二维数组
//1.先读取稀疏数组的第一行,创建二维数组
//2.在读取后面的行的数据,赋值给二维数组
int[][] arr2 = new int[spareseArray[0][0]][spareseArray[0][1]];
for(int i = 1; i < spareseArray.length;i++){
arr2[spareseArray[i][0]][spareseArray[i][1]] = spareseArray[i][2];
}
System.out.println("恢复后的二维数组为:");
for(int[] arr : arr2){
for(int date : arr){
System.out.printf("%d ",date);
}
System.out.println();
}
}