package com.coding.basic; import java.util.Arrays; public class MyArrayList implements MyList{ private int size = 0; private Object[] elementData = new Object[5]; @Override /** * add an element to the end */ public void add(Object o) { int index = size; if(isFull()){ extendLength(); } elementData[index] = o; size++; } @Override /** * add an element to certain index */ public void add(int index, Object o) { checkBounds(index); if(isFull()){ extendLength(); } for(int i=size; i>=index; i--){ elementData[i+1] = elementData[i]; } elementData[index] = o; size++; } @Override /** * get an element */ public Object get(int index) { checkBoundsForGet(index); if(index >= size){ return null; } return elementData[index]; } @Override /** * remove an element */ public Object remove(int index) { checkBounds(index); Object res = elementData[index]; for(int i=index+1; i<=size; i++){ elementData[i-1] = elementData[i]; } size--; return res; } @Override public int size() { return size; } /** * extends the length */ public void extendLength(){ elementData = Arrays.copyOf(elementData, elementData.length * 2); //System.out.println("add extend "+elementData.length); } public boolean isEmpty(){ return size == 0; } public boolean isFull(){ int len = elementData.length; if(size >= len-1){ return true; } return false; } public void checkBounds(int index){ if(index > size || index < 0){ //System.out.println("From MyArrayList: Index out of bounds"); throw new IndexOutOfBoundsException(OutOfBoundsMsg(index)); } } /** * for get() * @param index */ public void checkBoundsForGet(int index){ if(index >= elementData.length || index < 0){ //System.out.println("From MyArrayList: Index out of bounds"); throw new IndexOutOfBoundsException(OutOfBoundsMsg(index)); } } public String OutOfBoundsMsg(int index){ return "Index: "+index+", Size: "+size; } @Override public String toString() { String s = ""; for(int i=0; i<size; i++){ s += elementData[i] + " "; } return s; } public MyIterator iterator() { return new ArrayListIterator(this); } private class ArrayListIterator implements MyIterator{ private MyArrayList eleIterator; int pos;//current position int len;//size of elementData private ArrayListIterator(MyArrayList mal){ eleIterator = mal; pos = 0; len = mal.size(); } @Override public boolean hasNext() { return pos < len; } @Override public Object next() { return eleIterator.get(pos++); } } }