• 自己实现Arraylsit,实现其常用的几种增、删、该、查的方法


    /**
     * 自己实现arraylist
     * 添加 add(E e) add(int index,E e)
     * 获取 get(int index)
     * 删除 remove(int index)  remove(object o)
     * 替换 set(int index)
     * 长度 getSize()
     * @author cuiyc
     * @version 1.0
     * @date 2021/6/5 09:15
     */
    public class ArrayListDemo2<E> {
        /**
         * list的长度
         */
        private int size;
    
        private Object[] elemendData;
        /**
         * list的默认的长度为10
         */
        private static final int DEFAULT_CAPACITY=10;
    
        /**
         * 默认容量的object类型的数组
         */
        private static final Object[] DEFAULT_CAPACITY_ELEMENTDATA={};
    
        /**
         * 空参构造函数
         */
        public ArrayListDemo2(){
            this.elemendData=DEFAULT_CAPACITY_ELEMENTDATA;
        }
    
        /**
         * 带初始长度的构造函数
         * @param capacity
         */
        public ArrayListDemo2(int capacity){
            this.elemendData=new Object[capacity];
        }
    
        /**
         * 添加元素
         * @param e 要添加的元素
         * @return 处理结果
         */
        public Boolean add(E e){
            //1 需要确保数组的容量
            ensureListCapacity(size+1);
            //2 添加元素到list中
            elemendData[size++]=e;
            return true;
        }
    
        /**
         * 在list的某个位置上添加元素
         * @param index list的数组的位置
         * @param e 要添加的元素
         */
        public void add(int index,E e){
            //1 确保数组的容量
            ensureListCapacity(size+1);
            //2 数据的拷贝
            System.arraycopy(elemendData,index,elemendData,index+1,size-index);
            //3 数组元素的添加
            elemendData[index]=e;
            //4 数组size的+1
            size++;
        }
    
        /**
         * 获取某个位置上的元素
         * @param index list上的数组的位置
         * @return 获取到的元素
         */
        private E getValue(int index){
            return (E) elemendData[index];
        }
    
        /**
         * 移除list中某个位置的元素
         * @param index list的某个位置
         */
        private E remove(int index){
             List<String> list=new ArrayList<>();
            E oldValue= getValue(index);
            int numMoved=size-index-1;
            if(numMoved>0){
                System.arraycopy(elemendData,index+1,elemendData,index,numMoved);
            }
            elemendData[--size]=null;
            return oldValue;
        }
    
        /**
         * 移除list中的某个元素,传入的参数是object,数组中存的值
         * @param o
         */
        private Boolean remove(Object o){
            if(o==null){
                //如果o是空,怎么处理
                for (int i = 0; i < size; i++) {
                    if(getValue(i)==null){
                        fastRemove(i);
                        return true;
                    }
                }
            }else {
                //如果o不是空,怎么处理
                for (int i = 0; i < size; i++) {
                    if(o.equals(getValue(i))){
                        fastRemove(i);
                        return true;
                    }
                }
            }
            return false;
        }
    
        /**
         * 在某个位置赋值新的值
         * @param index list的数组的位置
         * @param e 新的值
         */
        public void setNewValue(int index,E e){
            elemendData[index]=e;
        }
    
        private int getSize(){
            return elemendData.length;
        }
    
        /**
         * 快速删除元素
         * @param index
         */
        public void fastRemove(int index){
            int numMoved=size-index-1;
            if(numMoved>0){
                System.arraycopy(elemendData,index+1,elemendData,index,numMoved);
            }
            elemendData[--size]=null;
        }
    
    
        /**
         * 确保list的数组的容量可以容纳新增的元素
         * @param miniCapacity 添加新的元素后,list的数组的长度
         */
        public void ensureListCapacity(int miniCapacity){
            //1 先对数组的长度进行逻辑上的一些判断 得到目前需要定义的一个list数组的长度
            int nowCapacity=caculateCapacity(elemendData,miniCapacity);
            //2 如果新添加元素后,数组的长度大于目前数组定义的一个长度,则需要扩容
            if(nowCapacity-elemendData.length>0){
                grow(nowCapacity);
            }
        }
    
        /**
         * 计算目前的list的数组的定义的长度。1 如果是第一次初始化list,则有可能是默认的10,也有可能是初始化的时候有定义数组长度。
         *                              2 如果不是第一次初始化list,则直接返回的是目前数组的实际长度+1的值。
         * @param elemendData
         * @param miniCapacity
         * @return
         */
        public int caculateCapacity(Object[] elemendData,int miniCapacity){
            if(elemendData==DEFAULT_CAPACITY_ELEMENTDATA){
                return Math.max(DEFAULT_CAPACITY,miniCapacity);
            }
            return miniCapacity;
        }
    
        /**
         * 扩容的机制
         * @param nowCapacity 目前数组的实际的最大的长度
         */
        public void grow(int nowCapacity){
            //目前list的数组的定义的一个容量大小
            int oldGuiDing_Capacity=elemendData.length;
            //扩容为1.5倍后的容量大小
            int newGuiDing_Capacity=oldGuiDing_Capacity+(oldGuiDing_Capacity>>1);
    
            //比较,扩容后的容量大小是否是比实际数组的最大长度还小,如果还小,则将实际的数组的最大长度赋值给需要扩容的容量
            if(newGuiDing_Capacity-nowCapacity<0){
                newGuiDing_Capacity=nowCapacity;
            }
    
            //数据拷贝,产生一个新的数组,将旧的数组的数据拷贝到新的数组中去
            Arrays.copyOf(elemendData,newGuiDing_Capacity);
        }
    }
    

      


    作者:RichardCui
    出处:https://www.cnblogs.com/yachao1120/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。该文章也同时发布在我的独立博客中-RichardCuiBlog

  • 相关阅读:
    BZOJ.1016.[JSOI2008]最小生成树计数(Matrix Tree定理 Kruskal)
    BZOJ.4031.[HEOI2015]小Z的房间(Matrix Tree定理 辗转相除)
    BZOJ.1014.[JSOI2008]火星人(Splay 二分 Hash)
    BZOJ.4903.[CTSC2017]吉夫特(Lucas DP)
    BZOJ.1011.[HNOI2008]遥远的行星(思路 枚举)
    BZOJ.1013.[JSOI2008]球形空间产生器(高斯消元)
    BZOJ.1007.[HNOI2008]水平可见直线(凸壳 单调栈)
    BZOJ.1003.[ZJOI2006]物流运输(DP 最短路Dijkstra)
    BZOJ.1001.[BeiJing2006]狼抓兔子(最小割ISAP)
    BZOJ.1085.[SCOI2005]骑士精神(迭代加深搜索)
  • 原文地址:https://www.cnblogs.com/yachao1120/p/14853341.html
Copyright © 2020-2023  润新知