Discuss / Java / 来一个简单的可变数组实现

来一个简单的可变数组实现

Topic source

Tiko_T

#1 Created at ... [Delete] [Delete and Lock User]
public class MyArray<T> implements Iterable<T>{
    private Object[] arr = null;
    private int size = 0;
    public MyArray(int capacity) {
        if (capacity > 0) {
            arr = new Object[capacity];
        }
        else {
            arr = new Object[8];
        }
        size = 0;
    }
    public MyArray() {
        arr = new Object[8];
        size = 0;
    }
    public boolean isEmpty() {
        return size == 0;
    }
    public T get(int index) {
        checkIndex(index);
        return (T)arr[index];
    }
    public void set(int index, T obj) {
        checkIndex(index);
        arr[index] = obj;
    }
    public void add(T obj) {
        if (size == arr.length) {
            grow();
        }
        arr[size++] = obj;
    }
    public T removeAt(int index) {
        checkIndex(index);
        T elem = (T)arr[index];
        for (int i = index+1; i < size; i ++) {
            arr[i-1] = arr[i];
        }
        arr[size-1] = null;
        size--;
        return elem;
    }
    private void grow() {
        int oldCapacity = arr.length;
        Object[] newArr = new Object[oldCapacity*2];
        for (int i = 0; i < arr.length; i ++) {
            newArr[i] = arr[i];
        }
        arr = newArr;
    }
    private void checkIndex(int index) {
        if (index < 0 || index >= size) {
            throw new IllegalArgumentException("Illegal index: " + index);
        }
    }
    // TODO : other method about equals, hashCode, subArray, searching, sorting, etc.
    
    @Override
    public Iterator<T> iterator() {
        return new MyArrayIterator();
    }
    
    private class MyArrayIterator implements Iterator<T> {
        private int index = 0;
        private boolean bNext = false;
        public MyArrayIterator() {
        }
        @Override
        public boolean hasNext() {
            return index < MyArray.this.size;
        }
        @Override
        public T next() {
            bNext = true;
            return (T)MyArray.this.get(index++);
        }
        @Override
        public void remove() {
            if (bNext == false) {
                throw new IllegalStateException("there is no last next() called.");
            }
            MyArray.this.removeAt(--index);
            bNext = false;
        }
    }
}

  • 1

Reply