Java实现数组增删改查

package 数组;

/**
 *
 *@author hejialai
 *@create 2019-03-11 10:48
 **/
public class GenericArray<T> {
    private T[] data;
    private int size;

    //构造方法
    public GenericArray(int capacity) {
        data = (T[])new Object[capacity];
    }
    // 无参构造方法,默认数组容量为10
    public GenericArray(){
        this(10);
    }
    //获取当前数组容量
    public int getCapactiy(){
        return this.data.length;
    }
    //获取当前元数个数
    public int count(){
        return this.size;
    }
    //判断是否为空
    public boolean isEmpty(){
        return size == 0;
    }
    //修改index位置的元数
    public void set(int index,T e){
        data[index]  = e;
    }
    //获取index位置的元数
    public T get(int index){
        checkIndex(index);
        return data[index];
    }
    // 查看数组是否包含元素e
    public boolean contains(T e){
        for (int i = 0; i < data.length; i++) {
            if(data[i].equals(e)){
                return true;
            }
        }
        return false;
    }
    // 获取对应元素的下标, 未找到,返回 -1
    public int find(T e){
        for (int i = 0; i < data.length; i++) {
            if(data[i].equals(e)){
                return i;
            }
        }
        return -1;
    }
    // 在 index 位置,插入元素e,
    public void add(int index, T e){
        checkIndex(index);
        //当数组元素等于容量带下,数组扩容为原来的两倍
        if(size == data.length){
            resize(2*data.length);
        }
        //index后面的所有数据依次向后移动一位,从最后面一位数据开始移动
        for (int i = size-1; i >=  index; i--) {
            data[i+1] = data[i];
        }
        //在indx位置插入数据
        data[index]  = e;
        size++;
    }
    //向头插入数据
    public void addFirst(T e){
        add(0,e);
    }
    //想尾部插入数据
    public void addLast(T e){
        add(size,e);
    }
    //删除index位置的元素,并返回
    public T remove(int index){
        checkIndex(index);
        T ret = data[index];
        //依次将index后面的所有的原始往前挪动u一位,从index+1位置开始挪动,并将最后一位的数据置空
        for (int i = index + 1; i < size; i++) {
            data[i-1] = data[i];
        }
        size--;
        data[size]  = null;
        //如果元素个数为容量的1/4,则缩容
        if(size == data.length/4 && data.length/2 != 0){
            resize(data.length/2);
        }
        return ret;
    }

    // 删除第一个元素
    public T removeFirst() {
        return remove(0);
    }

    // 删除末尾元素
    public T removeLast() {
        return remove(size - 1);
    }

    //从数组中删除指定元数
    public void removeElement(T e){
        int index = find(e);
        if(index != -1){//先从数组中查找index的元素是否找到再删除
            remove(index);
        }
    }


    //扩容
    private void resize(int capactiy) {
        T[] newData = (T[])new Object[capactiy];
        for (int i = 0; i < this.size; i++) {
            newData[i]  = data[i];
        }
        data = newData;
    }

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

    private void checkIndex(int index) {
        if(index < 0 || index >= size){
            throw new IllegalArgumentException("Add failed! Require index >=0 and index <= size.");
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_28394359/article/details/88399378