Java初学----数组拓展

一、应用需求

        在日常工作学习中,我们经常会遇到一个问题:在创建一个用户需要的数组时,如果我们或是用户并不能确定数组长度,这时候我们无论是将长度设置为多少,都有可能出现容量不足或是浪费过多空间的情况。此时我们就可以考虑使用数组拓展了。

二、基础概念

        在学习数组拓展前,我们需要清楚,一旦数组被创建,那么它的长度即容量无法被改变!而数组拓展能够对数组长度进行延伸的本质是:令系统创建一个长度(具体长度视情况而定)大于原数组(后用Arrayold表示)的新数组(后用Arraynew表示),

        然后将Arrayold中的元素全部复制到Arraynew中,最后将Arraynew的地址交给Arrayold中,后续则重复此步骤即可实现无视数组长度进行输入(若用户输入数组长度和Arraynew数组长度相差过多会影响运行效率)。

三、核心代码

private void checkCapacity(int needCount){//用来进行容器扩容

        //needCount为用户输入的还需要的数组数量,因为用户也许不止需要拓展一次

        //index为下一次元素的存储位置,也是目前为止数组的长度

        if(index+needCount>elements.length){

        //如果原数组剩余数量+用户还需要的数量>原数组长度
            //则需要进行扩容

            int newLength=elements.length*2;

            /*
            考虑到用户所需长度与扩容长度可能过大
            若新数组长度为原数组长度的2倍仍无法满足需求
            则直接令新数组长度为用户所需数组长度加上原数组长度
            以满足不同用户的需求
            */

            if(newLength<needCount+index){

                newLength=needCount+index;

            
            }
            Object[] newArray = new Object[newLength];
            
            /*
            使用Object类型是因为用户所传的是未知类型的元素
            若只是使用基本类型的元素进行存储,直接使用基础类型的数组即可
            */
            
            for(int i=0; i<index; i++){//通过循环赋值

                newArray[i] = elements[i];

            }   

            elements = newArray;//将新数组地址传给原数组,便可通过原数组地址使用到新数组长度

        }

    }

一般来说会将数组拓展内容写在方法中,以保证每次结束方法后,新数组都会被系统释放,于是我们借此可以循环使用数组拓展方法,不断地使用和拓展数组长度。

四、实验例题

当然,数组拓展内容也可以不写在方法中。该例题只是简单的验证了数组拓展的可行性,因此没有一次输入多个内容的可能,同时并未使用方法。

由用户无限输入数组,输入的内容不能重复,直到用户输入"0"时停止输入并输出用户输入的数组。

import java.util.Scanner;

public class Array_{

    public static void main(String[] args){

        Scanner scanner=new Scanner(System.in);

        int number=-1;

        //number不只是存储用户输入内容的变量,也是控制while循环的关键

        int[] array=new int[3];//此时数组大小可合理安排

            System.out.println("请输入数组:");

            System.out.println("输入0结束输入");

            b:while(true){

                a:for(int num=0;num<array.length;num++){

                //当输入内容重复时,continue控制运行至此重新输入
           
                    number=scanner.nextInt();

                    if(number==0){
                    
                        break b;//当用户输入为0时,直接跳出while循环
                    }
                    
                    for(int i=0;i<num;i++){//循环遍历之前的内容判断是否有相同的元素

                        if(number==array[i]){

                            System.out.println("请重新输入!");

                            continue a;//当用户输入内容重复时,重新输入

                        }

                    }

                    array[num]=number;
                    
                    //下面进行数组拓展

                    if(num==array.length-1){//当数组下标已经移动至末尾时,进行数组拓展

                        int[] nums=new int[array.length+3];

                        for(int j=0;j<array.length;j++){
                        
                            nums[j]=array[j];

                        }
                        array=nums;

                        System.out.println("完成数组拓展");//以此证明完成了数组拓展

                    }

                }
   
            } 
                System.out.println("以下是输入的数组");

                for(int num=0;num<array.length;num++){

                    if(array[num]!=0){
                    
                        System.out.print(array[num]+" ");

                    }

                }

                System.out.println();

    }

}

输入样例:1 2 3 4 5 6 7 8 9 1 0

//输入到"3","6","9"时终端输出"完成数组拓展",输入1时终端输出"请重新输入!"。

输出结果:

以下是输入的数组
1 2 3 4 5 6 7 8 9

  • 8
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值