什么是稀疏数组?
- 当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组
- 稀疏数组的处理方法是:
- 记录数组一共有几行几列,有多少个不同值
- 把具有不同值的元素的行列及值记录在一个小规模的数组中、从而缩小程序的规模
可看到原数组的大小是 6行7列 除了0还有8个非0的值,分别是22、15、11、17、-6、39、91、28
稀疏数组固定3列,分别记录原数组的 行 列 值,至于有多少行就看原数组有多少个非0的值,原数组有8个非0的值,所以当前的稀疏数组有8+1=9行 ,第一行记录原数组的大小规模,,其他的每一行(这里的行是稀疏数组的行)都记录原数组非0值的存储信息
首先,看一下我的原二维数组的结构
废话不多说,直接上代码
/**
* @author 梁东明
* 在Editor 的File and Code Templates 修改
*/
public class sparseArray {
public static void main(String[] args) {
// TODO Auto-generated method stub
//创建一个原始的二维数组
//注意 没有赋值的默认为 0
int Arr1[][] =new int[6][7];
Arr1[0][3] = 22;
Arr1[0][6] = 15;
Arr1[1][1] = 11;
Arr1[1][5] = 17;
Arr1[2][3] = -6;
Arr1[3][5] = 39;
Arr1[4][0] = 91;
Arr1[5][2] = 28;
System.out.println("原始的二维数组");
//增强for循环遍历输出原数组
for (int[] row : Arr1){
for (int data : row){
System.out.print(data+"\t");
}
System.out.println();
}
//将原始二维数组转换成稀疏数组
//1、先遍历二维数组,得到非0的数据的个数
int sum = 0;
for (int[] row : Arr1) {
for (int data : row) {
if (data != 0){
sum ++;
}
}
}
//创建对应的稀疏数组
//count + 1 是为了多记录一条原始数组的大小
int[][] sparseArr = new int[sum + 1][3];
//给稀疏数组赋值
sparseArr[0][0] = 6;
sparseArr[0][1] = 7;
sparseArr[0][2] = sum;
//遍历二维数组,将非0的 值存储在稀疏数组 中
int count = 0; //用来记录每一行的值都是原数组第几个非零值
for (int i = 0; i < Arr1.length; i++) {
for (int j = 0; j < Arr1[i].length; j++) {
if (Arr1[i][j] != 0){
count ++;
sparseArr[count][0] = i;
sparseArr[count][1] = j;
sparseArr[count][2] = Arr1[i][j];
}
}
}
System.out.println();
//遍历输出稀疏数组
System.out.println("得到的稀疏数组是");
for (int i = 0; i < sparseArr.length; i++) {
System.out.print("\n"+sparseArr[i][0]+"\t"+sparseArr[i][1]+"\t"+sparseArr[i][2]);
}
//将稀疏数组还原 原二维数组
/*
1、先读取稀疏数组的第一行,根据第一行的信息创建原始数组
2、再读取稀疏数组的其他行,给原数组的元素赋值
*/
//1、先读取稀疏数组的第一行,根据第一行的信息创建原始数组
//注意 sparseArr[0][0] = 6, sparseArr[0][1] = 7;
//所以下行语句等价于 int Arr2[][] =new int[6]7];
int Arr2[][] =new int[sparseArr[0][0]][sparseArr[0][1]];
//2、再读取稀疏数组的其他行,给原数组的元素赋值
for (int i = 1; i < sparseArr.length; i++) {
Arr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
}
System.out.println();
System.out.println("恢复后的二维数组");
for (int[] row : Arr2){
for (int data : row){
System.out.print(data+"\t");
}
System.out.println();
}
}
}
小技巧
以后的自己写的代码 都可以显示出处啦!!
你好,我是小白,期待与你的下次相遇!!!