среда, 1 августа 2012 г.

simplification: ArrayList

Здесь приводится упрощенная версия класса java.util.ArrayList

----------------------------------------------------------------
-- Код:

import java.util.Arrays;
import java.util.Iterator;

public class XArrayList implements Iterable {
    private Object[] data;
    private int size = 0;

    public XArrayList() {
        this(10);
    }

    public XArrayList(int initialCapacity) {
        this.data = new Object[initialCapacity];
    }

    public void add(Object element) {
        ensureCapacity(size + 1);
        data[size++] = element;
    }

    public void add(int index, Object element) {
        ensureCapacity(size + 1);
        System.arraycopy(data, index, data, index + 1, size - index);
        data[index] = element;
        size++;
    }

    public Object get(int index) {
        rangeCheck(index);
        return data[index];
    }

    public Object set(int index, Object element) {
        rangeCheck(index);
        Object oldValue = data[index];
        data[index] = element;
        return oldValue;
    }

    public Object remove(int index) {
        rangeCheck(index);
        Object oldValue = data[index];
        int numMoved = size - index - 1;
        System.arraycopy(data, index + 1, data, index, numMoved);
        data[--size] = null;
        return oldValue;
    }

    @Override
    public Iterator iterator() {
        return new Iterator() {
            private int iteratorIndex = 0;

            @Override
            public boolean hasNext() {
                return iteratorIndex < size;
            }

            @Override
            public Object next() {
                return data[iteratorIndex++];
            }

            @Override
            public void remove() {
                throw new UnsupportedOperationException();
            }
        };
    }

    public int size() {
        return size;
    }

    @Override
    public String toString() {
        StringBuilder builder = new StringBuilder();
        builder.append("[");
        for (int k = 0; k < size; k++) {
            builder.append(data[k]);
            if (k < size - 1) {
                builder.append(", ");
            }
        }
        builder.append("]");
        return builder.toString();
    }

    private void ensureCapacity(int minCapacity) {
        if (minCapacity > size) {
            int newCapacity = 1 + (3 * data.length) / 2;
            Object[] tmpData = new Object[newCapacity];
            System.arraycopy(data, 0, tmpData, 0, data.length);
            data = tmpData;
        }
    }

    private void rangeCheck(int index) {
        if (index >= size || 0 > index) {
            throw new IndexOutOfBoundsException();
        }
    }
}

class XArrayListTest {
    public static void main(String[] args) {
        XArrayList list = new XArrayList(1);
        list.add(0); //[0]
        list.add(1); //[0, 1]
        list.add(2); //[0, 1, 2]
        list.add(3); //[0, 1, 2, 3]
        list.add(4); //[0, 1, 2, 3, 4]
        list.remove(2); //[0, 1, 3, 4]
        list.add(0, 10); //[10, 0, 1, 3, 4]
        list.add(1, 20); //[10, 20, 0, 1, 3, 4]
        for (Object element : list) {
            System.out.print(element + " ");
        }
        System.out.println();
        System.out.print(list);
    }
}

----------------------------------------------------------------