数组的插入和删除

数组的插入和删除

数组的插入:

比如 a[10]定义的数组长度为10 

插入数据之后数组长度不是应该变为11吗

同理删除数据数组长度不是应该变为9吗?

单纯的数据移位,那数组最后的那个元素的值不是丢失了吗?

如果要做这种数组长度变更的删除和插入该怎么做?

正在回答

登陆购买课程后可参与讨论,去登陆

1回答

同学你好,数组的长度一旦定义了则无法改变。例如:int[] arr = new int[10],声明了一个数组长度为10的整型数组,此时数组中元素均是有初始值的,均为0,也就是说数组arr中元素为十个零。若想要修改数组长度则需要重新对数组进行初始化,例如arr = new int[5];

https://img1.sycdn.imooc.com//climg/63799010095ba8ea05350358.jpg

  1. 问题中描述的“插入数据、删除数据”具体指代的是什么呢?建议结合代码具体描述下同学的疑问。

  2. 若是按照如下数据依次移动的方式,则会导致最后一个元素丢失。

    https://img1.sycdn.imooc.com//climg/63798f1b09f6baa007880507.jpg

  3. 若是需要修改数组长度实现插入、删除操作,则需重新定义一个新的数组,用于接收修改后的数组元素的值。

祝学习愉快~

  • 一脸懵逼的萌新 提问者 #1

    如果是新创建的话

    int[] n=new int[10];

    n=new int[5];

    这种情况那新开辟的地址 是覆盖之前的内存地址还是重新开辟一片地址,

    如果是新开辟一片地址那之前旧的地址会自动示范吗?


    2、如果我希望返回值是数组 也就是pubic int[] insertArr(int n,int b,int[] passArr){

        //新建一个数组,循环赋价给新的数组

        int jieshouArr = new int[11];

        for(int i=0;i<passArr.length;i++){

            jieshouArr [i]=passArr[i];

        }    

       // 这样赋予之后最后一个元素就为0 并空了出来

        //然后在想视频所示移动位置,插入到指定位置,最后返回新的这个数组

        return jieshouArr ;


    }


    那我在接受这个返回值的时候 是否可以直接

    int [] passArr = new int[10];

    //在下标3的地方插入4

    int xxxArr = className.insertArr(3,4,passArr );

    这个时候在打印xxxArr.length 应该是11


    请问上述方法可以这么搞吗

    2022-11-20 14:30:20
  • 一脸懵逼的萌新 提问者 #2
    package imooc.com.lvyouDemo;
    
    public class InsertArrClass {
    
    	public int[] insertArr(int insertIndex,int insertNum,int[] passArr){
    		int[] insertA = new int[passArr.length+1];
    		for(int i=0;i<passArr.length;i++) {
    			insertA[i]=passArr[i];
    		}
    		
    		for(int i=insertA.length-1;i>insertIndex;i--) {
    			insertA[i]=insertA[i-1];
    		}
    		insertA[insertIndex] = insertNum;
    		return insertA;
    	}
    	
    	public int[] deletaArr(int deletaIndex,int[] passArr){
    		int[] deletaA = new int[passArr.length-1];
    		int num=0;
    		for(int i=deletaIndex;i<passArr.length;i--) {
    			passArr[deletaIndex+num]=passArr[deletaIndex+num+1];
    			num++;
    			if(num>passArr.length-deletaIndex-2) {
    				break;
    			}
    		}
    		
    		for(int i=0;i<deletaA.length;i++) {
    			deletaA[i]=passArr[i];
    		}
    		return deletaA;
    	}
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		int[] passArr = {1,2,3,4,5,6,7,8};
    		InsertArrClass vc = new InsertArrClass();
    		int[] xinArr = vc.insertArr(8,9,passArr);
    		System.out.println("插入后新的数组长度"+xinArr.length);
    		
    		System.out.print("插入后后新的数组元素");
    		for(int i:xinArr) {
    			System.out.print(i+" ");
    		}
    		
    		xinArr = vc.deletaArr(4,passArr);
    		System.out.println();
    		System.out.println("删除后新的数组长度"+xinArr.length);
    		System.out.print("删除后新的数组元素");
    		for(int i:xinArr) {
    			System.out.print(i+" ");
    		}
    	}
    
    }

    这样写不是是更符合主题,这样写会不会有什么问题?

    2022-11-20 15:59:47
  • 同学你好

    1. 开辟新地址,旧的会被回收。

    2. 同学代码实现是可以的,不过要注意数组下标的范围,避免出现数组下标越界。

    注:同学也可尝试使用Arrays.copy方法实现数组的复制哦。

    https://img1.sycdn.imooc.com//climg/6379e56e09ded27208730070.jpg

    https://img1.sycdn.imooc.com//climg/6379e8d50943e54914710245.jpg

    代码示例如下:

    int[] passArr = {1, 2, 3, 4, 5, 6, 7, 8};
    int[] a1 = Arrays.copyOf(passArr, passArr.length);
    int[] a2 = Arrays.copyOf(passArr, passArr.length + 1);
    int[] a3 = Arrays.copyOf(passArr, passArr.length - 1);
    System.out.println(Arrays.toString(a1) + "\n" + Arrays.toString(a2) + "\n" + Arrays.toString(a3));

    运行结果如下:

    https://img1.sycdn.imooc.com//climg/6379e8960977a27e03500095.jpg

    祝学习愉快~

    2022-11-20 16:44:55
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师