二维数组和稀疏数组
问题:将一个二维数组转化为稀疏数组,并还原
1.要点:要知道稀疏数组的构成(以下图片行列值为数组的下角标)
2.代码的实现
public static void main(String[] args) {
int[][] array1 = new int[11][11];
array1[1][2] =1;
array1[2][3] =2;
array1[3][5] =5820;
System.out.println("原始的数组=============" );
for (int[] ints : array1) {
for (int anInt : ints) {
System.out.print(anInt +"\t");
}
System.out.println();
}
//转换为稀疏数组
//1.定义稀疏数组
int sum =0;//这里的sum是为了获取原始数组中的有效元素的个数
for (int i = 0; i < array1.length; i++) {
for (int j = 0; j < array1.length; j++) {
if (array1[i][j]!=0){
sum++;
}
}
}
int[][] array2 = new int[sum+1][3];//这里的行数为sum+1 表示的是需要存储的有效元素个数为sum个 ,但是 头部信息需要占一行,所以为sum+1
//2.获取稀疏数组的头部信息,原数组的行数和列数,以及有效元素的个数
array2[0][0] =11;
array2[0][1] = 11;
array2[0][2] =sum;
//3.在稀疏数组中进行存储有效元素的信息----获取有效元素在原二维数组中的 所在行和所在列
int count=0;
for (int i = 0; i < array1.length; i++) {
for (int j = 0; j < array1[i].length; j++) {//这层循环是循环原始数组中的每行的元素值
if (array1[i][j]!=0){
count++;//count表示原始数组中 有效元素的行数
array2[count][0]= i;//在遍历原始二维数组的时候,i表示原始数组所在的行数,j表示原始数组的所在列
array2[count][1]=j;//所在列
array2[count][2]=array1[i][j];//这个是元素值
}
}
}
//4.遍历稀疏二维数组
System.out.println("稀疏二维数组==============");
for (int[] ints : array2) {
for (int anInt : ints) {
System.out.print(anInt +"\t");
}
System.out.println();
}
//从原始数组到稀疏数组 就相当于一次压缩
//如在数据传输中就可以节约资源,然后再本地进行解析(对稀疏数组进行解压)
//从稀疏的头部信息中获取,用于解析稀疏数组的行数和列数
int[][] array3 = new int[array2[0][0]][array2[0][1]];//array3是用来存放解析后的稀疏数组的
//从稀疏数组中获取值,然后存放在array3中
for (int i = 1; i < array2.length; i++) {
array3[array2[i][0]][array2[i][1]] = array2[i][2];//直接在array3 中的相应的地方存入值即可
}
System.out.println("输出还原后的数组===================");
for (int[] ints : array3) {
for (int anInt : ints) {
System.out.print(anInt +"\t");
}
System.out.println();
}
}
3.这个稀疏数组其实不难,主要在于理解原始数组和稀疏数组中相对应的关系,脑子里有两个数组的模型就可以慢慢一步一步的实现出来
4.碰到的问题:
在下面最开始没有加count ,我是想当然的把count用i代替,很自然的下角标越界,i表示原数组的行数,而count表示的原数组中的有效元素所在行,有很大的区别
然后 "for (int j = 0; j < array1[i].length; j++) " 这里面的array1[i].length和array1.length的区别是二维数组中两个不同的数组
//3.在稀疏数组中进行存储有效元素的信息----获取有效元素在原二维数组中的 所在行和所在列
int count=0;
for (int i = 0; i < array1.length; i++) {
for (int j = 0; j < array1[i].length; j++) {//这层循环是循环原始数组中的每行的元素值
if (array1[i][j]!=0){
count++;//count表示原始数组中 有效元素的行数
array2[count][0]= i;//在遍历原始二维数组的时候,i表示原始数组所在的行数,j表示原始数组的所在列
array2[count][1]=j;//所在列
array2[count][2]=array1[i][j];//这个是元素值
}
}
}