/*
Write a program to implement your own ArrayList class. It should
contain add(), get(), remove(), size() methods. Use dynamic array logic.
It should increase its size when it reaches threshold.
*/


import java.util.Arrays;

public class MyArrayList
{

    private Object[] myStore;
    private int actSize = 0;

    public MyArrayList()
    {
        myStore = new Object[10];
    }

    public Object get(int index)
    {
        if(index < actSize)
            {
                return myStore[index];
            }
        else
            {
                throw new ArrayIndexOutOfBoundsException();
            }
    }

    public void add(Object obj)
    {
        if(myStore.length-actSize <= 5)
            {
                increaseListSize();
            }
        myStore[actSize++] = obj;
    }

    public Object remove(int index)
    {
        if(index < actSize)
            {
                Object obj = myStore[index];
                myStore[index] = null;
                int tmp = index;
                while(tmp < actSize)
                    {
                        myStore[tmp] = myStore[tmp+1];
                        myStore[tmp+1] = null;
                        tmp++;
                    }
                actSize--;
                return obj;
            }
        else
            {
                throw new ArrayIndexOutOfBoundsException();
            }
    }

    public int size()
    {
        return actSize;
    }

    private void increaseListSize()
    {
        myStore = Arrays.copyOf(myStore, myStore.length*2);
        System.out.println("\nNew length: "+myStore.length);
    }

    public static void main(String a[])
    {
        MyArrayList mal = new MyArrayList();
        mal.add(new Integer(2));
        mal.add(new Integer(5));
        mal.add(new Integer(1));
        mal.add(new Integer(23));
        mal.add(new Integer(14));
        for(int i=0; i<mal.size(); i++)
            {
                System.out.print(mal.get(i)+" ");
            }
        mal.add(new Integer(29));
        System.out.println("Element at Index 5:"+mal.get(5));
        System.out.println("List size: "+mal.size());
        System.out.println("Removing element at index 2: "+mal.remove(2));
        for(int i=0; i<mal.size(); i++)
            {
                System.out.print(mal.get(i)+" ");
            }
    }
}

/*
Output:
2 5 1 23 14
New length: 20
Element at Index 5:29
List size: 6
Removing element at index 2: 1
2 5 23 14 29