我是靠谱客的博主 现实小笼包,最近开发中收集的这篇文章主要介绍自定义动态数组,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

自定义动态数组的基本操作:

1、定义一个数组(静态数组)
2、向指定位置添加元素e
3、获取指定索引位置的元素
4、修改指定索引位置的元素为e
5、查找是否包含元素e
6、查找数组中元素e的索引
7、删除指定索引位置的元素
8、动态数组:扩容(防止复杂度震荡)

/**
 * 数组:动态数组,泛型
 *
 * @author f242
 * @since V1.0.0
 * 2020-03-19 15:26
 */
public class Array<E> {
    private E[] data;
    private int size;

    /**
     * 构造函数:传入数组的容量capacity构造Array
     * @param capacity
     */
    public Array(int capacity){
        data = (E[])new Object[capacity];
        size =0;
    }

    /**
     * 无参构造函数,默认数组容量capacity=10
     */
    public Array(){
        this(10);
    }

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

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

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

    /**
     * 向所有元素最后添加一个元素
     * @param e
     */
    public void addLast(E e){
        add(size,e);
    }

    /**
     * 向所有元素前添加一个元素e
     * @param e
     */
    public void addFirst(E e){
        add(0,e);
    }

    /**
     * 在第index的位置上插入一个新元素e
     * @param index
     * @param e
     */
    public void add(int index,E e){
        if(index<0 || index>size){
            throw new IllegalArgumentException("Add falied,index is a illegal number");
        }
        if(size ==data.length){//扩容
            resize(data.length*2);
        }
        //从后面开始移动赋值
        for(int i=size-1; i>=index;i--){
            data[i+1] = data[i];
        }

        data[index]= e;
        size ++;
    }

    /**
     * 获取index索引位置的元素
     * @param index
     * @return
     */
    public E get(int index){
        if(index<0 || index >= size){
            throw new IllegalArgumentException("Get falied, index is illeagl");
        }
        return data[index];
    }

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

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

    /**
     * 修改index索引位置的元素为e
     * @param index
     * @param e
     */
    public void set(int index,E e){
        if(index<0 || index >= size){
            throw new IllegalArgumentException("Set failed,index is illlegal");
        }
        data[index] = e;
    }

    /**
     * 查找数组中是否有元素e
     * @param e
     * @return
     */
    public boolean contains(E e){
        for(int i=0;i<size; i++){
            if(data[i].equals(e)){
                return true;
            }
        }
        return false;
    }

    /**
     * 查找数组中元素e的索引,如果不存在返回-1
     * @param e
     * @return
     */
    public int find(E e){
        for(int i=0;i<size;i++){
            if(data[i].equals(e)){
                return i;
            }
        }
        return -1;
    }

    /**
     * 从数组中删除index位置的元素,返回删除的元素
     * @param index
     * @return
     */
    public E remove(int index){
        if( index<0 ||index>= size){
            throw new IllegalArgumentException("Remove falied,index is illegal");
        }
        E ret = data[index];
        for(int i=index+1;i<size;i++){
            data[i-1] = data[i];
        }
        size --;
//        data[size] =null; //loitering objects != memory leak

        if(size == data.length/4 && data.length / 2 !=0){//动态数组,防止复杂度震荡
            resize(data.length / 2);
        }
        return ret;
    }

    /**
     * 从数组中删除第一个元素,返回删除的元素
     * @return
     */
    public E removeFirst(){
        return remove(0);
    }

    /**
     * 从数组中删除最后一个元素,返回删除的元素
     * @return
     */
    public E removeLast(){
        return remove(size-1);
    }

    /**
     * 从数组中删除元素e
     * @param e
     */
    public void removeElement(E e){
        int index = find(e);
        if(index != -1){
            remove(index);
        }
    }

    @Override
    public String toString(){
        StringBuffer res = new StringBuffer();
        res.append(String.format("Array:size = %d, capacity = %dn",size,data.length));
        res.append("[");
        for(int i=0;i<size;i++){
            res.append(data[i]);
            if(i != size-1){
                res.append(",");
            }
        }
        res.append("]");
        return  res.toString();
    }

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

}

最后

以上就是现实小笼包为你收集整理的自定义动态数组的全部内容,希望文章能够帮你解决自定义动态数组所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(54)

评论列表共有 0 条评论

立即
投稿
返回
顶部