Java实现具有迭代器的线性表(顺序表)(3)

// 在迭代器的当前元素之前添加一个元素,注��是之前
        public void add(T e) {
            // set 和 remove 操作只能是在迭代器访问过(跳跃过)某元素之后才能进行
            isRemoveOrSetLegal = false; // 进行add操作之后,不能立即进行set() 或者 remove()
            SequenceListWithIterator.this.insert(e, nextIndex++);
        }

}

// 以默认的大小创建顺序表
    public SequenceListWithIterator() {
        capacity = DEFAULT_SIZE;
        elementData = new Object[capacity];
    }

// 以指定的大小创建顺序表
    public SequenceListWithIterator(int initSize) {
        capacity = 1;
        while (capacity < initSize)
            capacity <<= 1;// 将capacity设置成大于initSize的最小2次方
        elementData = new Object[capacity];
    }

public ListIterator<T> getIterator() {
        return new IteratorForSequenceList();
    }

// 获取顺序表中当前元素的个数
    public int length() {
        return size;
    }

// 获取顺序表中索引为 i 处的元素,i表示索引,即以 0 开始
    public T get(int i) {
        if (i < 0 || i > size - 1)
            throw new IndexOutOfBoundsException("顺序表索引越界");
        return (T) elementData[i];
    }

// 查看顺序表中指定元素的索引,若未找到,返回-1
    public int locate(T element) {
        for (int i = 0; i < size; i++)
            if (elementData[i].equals(element))
                return i;
        return -1;
    }

// 在顺序表的指定索引处插入一个元素
    public void insert(T element, int index) {
        if (index < 0 || index > size)
            throw new IndexOutOfBoundsException("顺序表索引越界");
        ensureCapacity(size + 1);// 确保顺序表满时进行扩容,从而能插入元素
        // 将指定索引后的所有元素向后移动一个位置
        // System.arraycopy(elementData, index, elementData, index + 1, size -
        // index);
        for (int i = size; i > index; i--)
            elementData[i] = elementData[i - 1];
        elementData[index] = element;
        size++;// 顺序表中的元素个数增1
    }

private void ensureCapacity(int minCapacity) {
        // 当数组容量已满时,对数组进行扩容。将容量扩展到大于minCapacity的最小2的次方
        if (minCapacity > capacity) {
            while (capacity < minCapacity)
                capacity <<= 1;
            elementData = Arrays.copyOf(elementData, capacity);
        }
    }

// 在顺序表的末尾添加一个元素
    public void add(T element) {
        insert(element, size);
    }

// 删除顺序表中指定索引处的元素
    public T delete(int index) {
        if (index < 0 || index > size - 1)
            throw new IndexOutOfBoundsException("顺序表索引越界");
        T oldValue = (T) elementData[index];
        int numMoved = size - index - 1;// 计算需要移动的元素个数
        if (numMoved > 0) {
            System.arraycopy(elementData, index + 1, elementData, index,
                    numMoved);
        }
        elementData[--size] = null;// 让垃圾回收器及时回收,避免内存泄露
        return oldValue;
    }

// 删除顺序表中的最后一个元素
    public T remove() {
        return delete(size - 1);
    }

// 判断顺序表是否为空表
    public boolean empty() {
        return size == 0;
    }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/04b594e4b7abfc217b4b13b19311cad9.html