中国近代史以内最详细的JAVA顺序表

public class MyArrayList {
    public long[] array;   //存放数据
    private int size;   //元素个数


    public MyArrayList(){
        array=new long[20];//ArrayList初始化时的长度
        size=0;//初始化时的size
        Arrays.fill(array,size,array.length,Long.MIN_VALUE);//初始化时数组里的值都应该是默认值
    }

    public int size(){
        return size;//返回size即可,不存在同名形参,可以不使用this
    }

    public void add(long val){
        ensureCapacity();//确保数组长度足够
        array[size]=val;
        size++;
    }

    private void ensureCapacity() { //因为只会在当前类是使用,因此对方法进行封装
        if (size<array.length){ //数组够用不用扩充
            return;
        }
        array=Arrays.copyOf(array,array.length*2);//  数组不够用时进行扩充,对原来的数组进行复制
        Arrays.fill(array,size,array.length,Long.MIN_VALUE);// 并对新的数组填充默认值
    }

    public long get(int index){
        if (index<0||index>size){       //首先对传进来的下标判断是否合法
            throw new RuntimeException("请输入正确的下标!");
        }
        return array[index];
    }

    public void add(int index,long val){
        if (index<0||index>size){       //首先对传进来的下标判断是否合法
            throw new RuntimeException("请输入正确的下标!");
        }
        ensureCapacity();   //添加元素时都需要判断数组长度是否足够
        for (int i=size;i>index;i--){
            array[i]=array[i-1];    //将原来的array[index]及以后的元素整体向后平移
        }
        array[index]=val;   //在index插入元素
        size++;     //加入了一个新元素后千万要记得size++
    }

    public long delete(int index){      //按下标删除
        if (index<0||index>size){       //首先对传进来的下标判断是否合法
            throw new RuntimeException("请输入正确的下标!");
        }
        long val=array[index];
        for (int i=index;i<size-1;i++){
            array[i]=array[i+1];        //将array[index]后的元素往前平移。并且覆盖掉原有的array[index]
        }
        size--; //删除了一个新元素后千万要记得size--
        Arrays.fill(array,size,array.length,Long.MIN_VALUE);//删除了一个元素后size也改变了,记得初始化size~arr.length之间的值
        return val;     //返回删除的值
    }

    public void removeFromHead(long val){
        int index=0;            //不建议使用for循环遍历查找删除的方式,因为时间复杂度是O(n*n)
        while (index!=size){    //查找想删除的元素是否存在
            if (array[index]==val){
                break;          //如果存在跳出循环,array[index]后的元素向前平移
            }
            index++;
        }
        if (index==size){       //没找到待删除的元素,直接返回
            return;
        }
        for (int i=index;i<size-1;i++){     //array[index]后的元素向前平移,覆盖掉了原来的array[index]
            array[i]=array[i+1];
        }
        size--;         //删除了一个新元素后千万要记得size--
        Arrays.fill(array,size,array.length,Long.MIN_VALUE);//删除了一个元素后size也改变了,记得初始化size~arr.length之间的值
    }

    public void removeFromLast(long val){
        int index=size;     //从后向前查找
        while (index<0){
            if (array[index]==val){     //查找想删除的元素是否存在
                break;
            }
            index--;
        }
        if (index==-1){     //没找到待删除的元素,直接返回
            return;
        }
        for (int i=index;i<size-1;i++){     //array[index]后的元素向前平移,覆盖掉了原来的array[index]
            array[i]=array[i+1];
        }
        size--;         //删除了一个新元素后千万要记得size--
        Arrays.fill(array,size,array.length,Long.MIN_VALUE);//删除了一个元素后size也改变了,记得初始化size~arr.length之间的值
    }

    public void removeAll(long val){
        int slow=0;     //新数组下标
        int quick;
        for (quick=0;quick<size;quick++){   //对原来的数组进行遍历查找val
            if (array[quick]!=val){         //如果不等就进行复制,slow为新数组长度
                array[slow]=array[quick];
                slow++;
            }
        }
        size=slow;
        Arrays.fill(array,slow,array.length,Long.MIN_VALUE);//size变为slow,对数组填充默认值
    }

    public void check(){    //检查方法
        if (array==null){
            throw new RuntimeException();
        }
        if (array.length==0){
            throw new RuntimeException();
        }
        if (size<0){
            throw new RuntimeException();
        }
        if (size>array.length){
            throw new RuntimeException();
        }
        for (int i=0;i<size;i++){
            if (array[i]==Long.MIN_VALUE){
                throw new RuntimeException();
            }
        }
        for (int i=size;i<array.length;i++){
            if (array[i]!=Long.MIN_VALUE){
                throw new RuntimeException();
            }
        }
    }
    
}

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值