zoukankan      html  css  js  c++  java
  • 关于数组的扩容

    基本数据类型数组的扩容和缩容:

    package test;
    /**
     * 实现基本数据类型数组的扩容和缩容
     * @author admin
     *
     */
    /*因为java中数组是固定的,不变是不能动态扩容的,
    想要插入一个数必然要重新创建一个数组,其长度比原数组大,
    然后对其进行拷贝,接下来要做的工作就是在新数组里面实现插入。*/
    public class ArrayTest {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            //定义一个长度为5的普通数组
            int[] arr ={5,1,4,2,6};
            System.out.print("扩容前的数组:");
            for(int i=0;i<arr.length;i++){
                System.out.print(arr[i]+" ");
            }
            System.out.println();
            
            
            //定义一个新的数组,长度为当前数组的长度加一
            int[] temp1 = new int[arr.length+1];
            //通过循环将当前数组的值赋给临时数组
            for(int i=0;i<arr.length;i++){
                temp1[i] = arr[i];
            }
            //将需要添加的值添加到临时数组的最后以为,即temp.length-1
            temp1[temp1.length-1] = 0;
            //最后将临时数组的值赋给当前数组
            arr = temp1;
            //最后将数组打印一遍,看添加是否成功
            System.out.print("扩容后的数组:");
            for(int i=0;i<arr.length;i++){
                System.out.print(arr[i]+" ");
            }
            System.out.println();
            //接下来就是数组的缩容
            //还是使用当前数组arr ,因为前面扩容的原因,它现在的长度为6
            
            System.out.print("缩容前的数组:");
            for(int i=0;i<arr.length;i++){
                System.out.print(arr[i]+" ");
            }
            System.out.println();
            //先定义一个临时数组,长度比arr要小一
            int[] temp2 = new int[arr.length-1];
            //加入你现在需要去掉数组下标为3的值
            for(int i=0; i<temp2.length;i++){
                //先判断数组下标的值,如果小于将于去掉值的下标则将arr数组的值赋给temp2,
                //一旦不满足条件后,temp2的当前下标值获取arr数组的下一个下标值
                if(i<3){
                    temp2[i] = arr[i];
                }else{
                    temp2[i] = arr[i+1];
                }
            }
            arr = temp2;
            //最后将数组打印一遍,看添加是否成功
            System.out.print("缩容后的数组:");
            for(int i=0;i<arr.length;i++){
                System.out.print(arr[i]+" ");
            }
            
        }
    
    }

    输出结果:

    扩容前的数组:5 1 4 2 6
    扩容后的数组:5 1 4 2 6 0
    缩容前的数组:5 1 4 2 6 0
    缩容后的数组:5 1 4 6 0

    然后是对象数组的扩容和缩容:

    package test;
    /**
     * 对象数组的扩容和缩容
     * @author admin
     *
     */
    public class ObjectArray {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            Data data = new Data();
            Student[] stu = data.setData();
            System.out.println("数组扩容前打印输出:");
            for(int i=0;i<stu.length;i++){
                System.out.println(stu[i].getName()+"	"+stu[i].getAge()+"	"+stu[i].getGender());
            }
            
            //对象数组的扩容
            Student[] temp1 = new Student[stu.length+1];
            //与普通数组扩容大致步骤相同
            for(int i=0;i<stu.length;i++){
                temp1[i] = stu[i];
            }
            
            //创建需要加入对象数组的数据,并将其插入临时独享数组最后一位
            Student stu2 = new Student();
            stu2.setName("小王");
            stu2.setAge(18);
            stu2.setGender("男");
            //不能给对象数组的最后一位单独赋值,因为最后一位开始只是申明的这个对象并没有具体的指向地址,直接赋值会产生空指针错误
            temp1[temp1.length-1] = stu2;
            
            //将temp1的值赋给原对象数组
            stu = temp1;
            System.out.println("数组扩容后打印输出:");
            for(int i=0;i<stu.length;i++){
                System.out.println(stu[i].getName()+"	"+stu[i].getAge()+"	"+stu[i].getGender());
            }
            
            //对象数组的缩容
            System.out.println("数组缩容前打印输出:");
            for(int i=0;i<stu.length;i++){
                System.out.println(stu[i].getName()+"	"+stu[i].getAge()+"	"+stu[i].getGender());
            }
            
            //创建一个Student对象数组,长度为stu对象数组长度减一
            Student[] temp2 = new Student[stu.length-1];
            //对象数组的缩容与普通数组并没有什么差别
            //这次是需要去掉数组下标为2的值
            
            ////从下标2开始,后面一位往前移动一位
            for(int i=2;i<stu.length-1;i++){
                stu[i] = stu[i+1];
            }
            //将当前对象数组前temp2的长度位的值赋给temp2,也就这stu的最后一个值并不赋给temp2数组
            for(int i=0;i<temp2.length;i++){
                temp2[i] = stu[i];
            }
            //将temp2的值赋给原对象数组
            stu = temp2;
            
            System.out.println("数组缩容后打印输出:");
            for(int i=0;i<stu.length;i++){
                System.out.println(stu[i].getName()+"	"+stu[i].getAge()+"	"+stu[i].getGender());
            }
        }
        
    }
    class Student{
        private String name;
        private int age;
        private String gender;
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
        public String getGender() {
            return gender;
        }
        public void setGender(String gender) {
            this.gender = gender;
        }
        
        
    }
    class Data{
        /**
         * 返回Student类型的对象数组
         * @return stu[]
         */
        public Student[] setData(){
            //创建对象并赋值
            Student stu1 = new Student();
            stu1.setName("张三");
            stu1.setAge(18);
            stu1.setGender("男");
            Student stu2 = new Student();
            stu2.setName("李四");
            stu2.setAge(17);
            stu2.setGender("男");
            Student stu3 = new Student();
            stu3.setName("小琴");
            stu3.setAge(18);
            stu3.setGender("女");
            //将对象的值添加进入对象数组中
            Student[] stu = new Student[3];
            stu[0] = stu1;
            stu[1] = stu2;
            stu[2] = stu3;
            return stu;    
        }
    }

    结果为:

    数组扩容前打印输出:
    张三 18 男
    李四 17 男
    小琴 18 女
    数组扩容后打印输出:
    张三 18 男
    李四 17 男
    小琴 18 女
    小王 18 男
    数组缩容前打印输出:
    张三 18 男
    李四 17 男
    小琴 18 女
    小王 18 男
    数组缩容后打印输出:
    张三 18 男
    李四 17 男
    小王 18 男

  • 相关阅读:
    FTP文件传输应用分析
    A*寻路算法
    Asp.net页面事件引发后台程序处理原理
    开发人员的基本原则(转)
    定位new表达式
    常量对象的动态分配和释放
    PostThreadMessage使用
    最美丽的数学公式
    仿函数
    CF1598EStaircases【计数】
  • 原文地址:https://www.cnblogs.com/mqq123/p/8059707.html
Copyright © 2011-2022 走看看