Java稀疏数组

Java稀疏数组

稀疏数组是一种记录有效数字,省略重复无效的数字的一种数组记录方式

在这里插入图片描述

这个二维数组中,记录了大量的无效数组元素,占用了大量内存空间,那么怎么解决这个问题呢?就需要稀疏数组。

在这里插入图片描述

稀疏数组建减少了大量无用数据,记录了原本数组的行列,有效值个数,每个数组元素的下标和值。

稀疏数组的列是固定的3列,行是有效值个数+1。

public class Day1{
    public static void main(String[] args){
        //1.创建一个普通数组
        int [][] array=new int[6][7];
        //2.为数组有值部分赋值
        array[0][3]=22;
        array[0][6]=15;
        array[1][1]=11;
        array[1][5]=17;
        array[2][3]=-6;
        array[3][5]=39;
        array[4][0]=91;
        array[5][2]=28;
        //3.通过双重for循环输出这个数组
        for(int i=0; i<array.length; i++){
            for(int j=0; j<array[i].length; j++){
                System.out.print(array[i][j]+"\t");
            }
            System.out.println();//输出效果为第一幅图片
        }
    }
}

转化为稀疏数组

//1.创建一个稀疏数组,由于创建一个稀疏数组必须知道数组的有效值 为多少,所以我们先求出数组的有效值
//int[][] array1=new int[][];
System.out.print("行\t列\t值\n");
int sum=0;
for(int i=0; i<6; i++){
    for(int j=0; j<7; j++){//第一种遍历方式
        if(array[i][j]!=0){
            sum++;
        }
    }
}
//2.知道了有效数值,我们来创建一个稀疏数组
int [][] array1=new int[sum+1][3];
//3.记录普通数组的行,列,有效值,就是稀疏数组的第一行
array1[0][0]=6;
array1[0][1]=7;
array1[0][2]=sum;
//4.遍历普通数组,将非0的数存在稀疏数组中
int num=0;
for(int i=0; i<array.length; i++){
    for(int j=0; j<array[i].length;j++){//第二种遍历方式。两个for循环,第一个for循环遍历行数i(array.length),第二个for循环遍历列数j(array[i].length)
        if(array[i][j]!=0){
            num++;
            array1[num][0]=i;
            array1[num][1]=j;
            array1[num][2]=array[i][j];
        }
    }
}
//5.输出这个数组
for(int i=0; i<array1.length;i++){
    for(int j=0; j<3;j++){
        System.out.print(array1[i][j]+"\t");
    }
    System.out.println();//效果为第二幅图片
}

易犯错误:

  1. 粗心导致把 j 写成 i
  2. 把array[i]当成一个值
//把稀疏数组还原为普通数组
//1.创建一个普遍数组,把稀疏数组的行列赋给普通数组
int [][] array2=new int[array1[0][0]][array1[0][1]];
//2.遍历稀疏数组,把有效值赋给这个普通数组的坐标
for(int i=1; i<array1.length; i++){//这里i等于1,因为不需要从第一行开始
    array2[array1[i][0]][array1[i][1]]=array1[i][2];
}
//3.输出这个数组
 for(int i=0; i<array2.length; i++){
            for(int j=0; j<array[i].length; j++){
                System.out.print(array[i][j]+"\t");
            }
            System.out.println();
        }

在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值