ArrayList重写(5)ArrayList实现remove方法

package Study.Collection;

/**
 * <p>Description: </p>
 * 增加remove方法
 * @author zhangyan
 * @date 2018/12/19 14:19
 */
public class YanArrayList04<E> {

    private Object[] elementData;

    private int size;

    private static final int DEFALT_CAPACITY = 10;


    public YanArrayList04() {
        elementData = new Object[DEFALT_CAPACITY];
    }

    public YanArrayList04(int capacity) {

        if (capacity < 0) {
            throw new RuntimeException("容器的容量不能为负数");
        } else if (capacity == 0) {
            elementData = new Object[DEFALT_CAPACITY];
        } else {
            elementData = new Object[capacity];
        }


    }

    //size方法
    public int size() {
        return size;
    }

    //isEmpty方法
    public boolean isEmpty() {
        return size == 0 ? true : false;
    }


    public void add(E element) {

        if (size == elementData.length) {

            Object[] newArray = new Object[elementData.length + (elementData.length >> 1)];  //10-->10+10/2
            System.arraycopy(elementData, 0, newArray, 0, elementData.length);
            elementData = newArray;
        }

        elementData[size++] = element;
    }

    public E get(int index) {

        checkRange(index);

        return (E) elementData[index];
    }

    public void set(E element, int index) {

        checkRange(index);

        elementData[index] = element;

    }

    public void checkRange(int index) {
        if (index < 0 || index > size - 1) {

            throw new RuntimeException("索引不合法:" + index);
        }
    }

    public void remove(E element) {
        //element,将它和所有元素挨个比较,获得第一个比较为true的,返回。
        for (int i = 0; i < size; i++) {
            if (element.equals(get(i))) {   //容器中所有的比较操作,都是用的equals而不是==

                //将该元素从此处移除
                remove(i);
            }
        }
    }

    //带参数的移除,用于调用
    public void remove(int index) {

        //a,b,c,d,e,f,g,h变成a,b,c,e,f,g,h
        //删除实际上是copy操作
        int numMoved = elementData.length - index - 1;
        if (numMoved > 0) {
            //从index+1开始拷贝,到index的位置,拷贝的数据时numMoved个,想当如把index之后的数都前移一位
            System.arraycopy(elementData, index + 1, elementData, index, numMoved);
        }

        elementData[--size] = null;

    }

    public String toString() {

        StringBuilder sb = new StringBuilder();

        //[a,b,c]
        sb.append("[");
        for (int i = 0; i < size; i++) {
            sb.append(elementData[i] + ",");
        }
        sb.setCharAt(sb.length() - 1, ']');

        return sb.toString();
    }

    //测试
    public static void main(String[] args) {
        YanArrayList04 s1 = new YanArrayList04();

        for (int i = 0; i < 40; i++) {
            s1.add("baba" + i);
        }

        s1.remove("baba3");
        System.out.println(s1);
        System.out.println(s1.size);
        System.out.println("########################");
        s1.remove(4);
        System.out.println(s1);
        System.out.println(s1.size);
        //判断是否为空
        System.out.println(s1.isEmpty());


    }
}

解析:
移除操作和扩容的思想差不多,都是数组的拷贝。
思想是:

- 1,找到需要移除的值对应的索引;
- 2,根据这个索引来确定数组拷贝的范围。

具体参照详细代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值