数据结构-数组实现

本文详细探讨了数组这种基本数据结构的实现原理,包括其内存分配、索引计算以及优缺点。通过实例分析,揭示了数组在存储连续数据时的高效性和访问速度,同时也指出在插入和删除操作上的局限性。对于想要深入了解计算机科学基础的读者,这是一个不可或缺的知识点。
摘要由CSDN通过智能技术生成
public class Array<E> {

    private E[] data;

    private  int size; //数组元素个数

    private static  final  int DEFAULT_CAPACITY=10;//默认容量

    /**
     * 自定义数组长度
     * @param Capacity
     */
    public  Array(int Capacity){
       setInitCapacity(Capacity);
    }

    /**
     * 给数组提供一个默认大小
     */
    public Array(){
        setInitCapacity(DEFAULT_CAPACITY);
    }

    /**
     * 获取数组元素个数
     * @return
     */
    public int getSize(){
        return size;
    }

    /**
     * 设置初始大小
     * @param capacity
     */
    private void  setInitCapacity(int capacity){
        data= (E[]) new Object[capacity];
    }

    /**
     * 获取数组容量
     * @return
     */
    public int getCapacity(){
        return data.length;
    }

    /**
     * 监测数组是否为空
     * @return
     */
    public boolean isEmpty(){
        return size==0;
    }

    /**
     * 在指定index添加元素
     * @param index
     * @param e
     */
    public  void add(int index,E e){
         rangeCheck(index);//检查index是否越界
         ensureCapacity(size+1);
        //方式一
        for (int i=size-1;i>=index;i--){
             data[i+1]=data[i];
        }
        //System.arraycopy(data,index,data,index+1,size-index); 方式二
        data[index]=e;
        size++;
    }

     /**
     * 检查index是否越界
     * @param index
     */
    public void  rangeCheck(int index){
        if(index<0 || index>size){
            throw new IndexOutOfBoundsException("index:"+index);
        }
    }



    /**
     * 添加元素
     * @param e
     */
    public void add(E e){
        add(size,e);
    }

    /**
     * 在数组头部添加元素
     * @param e
     */
    public void addFrist(E e){
        add(0,e);
    }

    /**
     * 删除指定下标元素
     * @param index
     * @return
     */
    public E remove(int index){//1
        rangeCheck(index);
        //记录删除的元素
        E result=data[index];
        //方式一
        for(int i=index+1;i<size;i++){
            data[i-1]=data[i];
        }
        //方式二
        //System.arraycopy(data,index+1,data,index,size-index-1);
         size--;
         if(size==data.length>>1){
             resize(data.length>>1);
         }
       
        return result;
    }

    public void removeFrist(){
        remove(0);
    }

    public void removeLast(){
        remove(size-1);
    }

    public void removeElement(E e){
        int index = find(e);//查找指定元素
        remove(index);//删除元素
    }

    /**
     * 修改元素
     * @param index
     * @param e
     * @return
     */
    public E set(int index,E e){
        rangeCheck(index);
        E oldValue=data[index];
        data[index]=e;
        return oldValue;
    }

    /**
     * 根据下标得到对应元素
     * @param index
     * @return
     */
    public  E get(int index){
        rangeCheck(index);
        return data[index];
    }

    /**
     * 获取第一个元素
     *
     *
     */
    public E getFrist(){
        return get(0);
    }

    /**
     * 获取最后一个元素
     *
     *
     */
    public E getLast(){
        return get(size-1);
    }

    /**
     * 是否包含
     * @param e
     * @return
     */
    public boolean contains(E e){
        return find(e)>=0;
    }
    /**
     * 得到指定元素的下标
     */
    public int find(E index){
        for (int i = 0; i < size; i++) {
            if(data[i].equals(index)){
                return i;
            }
        }
        return -1;
    }

    /**
     *
     * @return
     */
    @Override
    public String toString() {
        StringBuilder sb=new StringBuilder();
        sb.append("Array:size="+size+",capacity="+data.length+"\n");
        sb.append("[");
        for (int i = 0; i < size; i++) {
            sb.append(data[i]);
            if(i!=size-1){
                sb.append(",");
            }
        }
        sb.append("]");
        return sb.toString();
    }

    /**
     * 数组扩容操作
     * @param minCapacity
     */
    private  void  resize(int minCapacity){
        E [] newData=(E[]) new Object[minCapacity];
        for (int i = 0; i < size; i++) {
            newData[i]=data[i];
        }
        data=newData;
    }

    /**
     * 合并数组
     * @param array
     * @return
     */
    public boolean addAll(Array<E> array){
        E[] objects = (E[]) array.toArray();
        int numNew = objects.length;

        ensureCapacity(numNew+size);
        //第一种方式
        for (int i=0;i<numNew;i++){
            data[size++]=objects[i];
        }
        //第二种方式
        //System.arraycopy(objects, 0, data, size, numNew);
        return numNew!=0;
    }

    /**
     * 删除全部
     * @param array
     * @return
     */
    public  boolean removeAll(Array<E> array){
        int count=size;
        if(array!=null){
            for (int i =0; i <size; i++) {
                data[i]=null;
                count--;
            }
            size=count;
            //把数组设置为默认长度
            setInitCapacity(DEFAULT_CAPACITY);
            return true;
        }
        return false;
    }

    /**
     * 监测是否满足扩容操作
     * @param minCapacity
     */
    private  void ensureCapacity(int minCapacity){
        if(minCapacity-data.length>0){
            addresize(minCapacity);
        }

    }

    /**
     * 添加操作时扩容
     * @param minCapacity
     */
    private  void addresize(int minCapacity){
        int oldCapacity=data.length;
        int newCapatity= oldCapacity << 1;
        if(newCapatity-minCapacity<0){
            newCapatity=minCapacity;
        }
        resize(newCapatity);//数组扩容
    }

    /**
     * 集合转数组
     * @return
     */
    public Object[] toArray(){
        return Arrays.copyOf(data,size);
    }

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值