package com.danny.hw1; import java.lang.reflect.Array; import java.util.Arrays; import javax.print.attribute.Size2DSyntax; public class ArrayList implements List{ //ArrayList Size private int size=0; private int array_len=2; //total element in here private Object[] elementData = new Object[array_len]; @Override public void add(Object o) { // TODO Auto-generated method stub adjustCapacity(); this.elementData[size++] = o; } @Override public void add(int index, Object o) { // TODO Auto-generated method stub //Check range. if index is invalid,then would not add anythings rangeCheckForAdd(index); adjustCapacity(); System.arraycopy(elementData, index, elementData, index + 1,size - index); this.elementData[index] = o; this.size++; } @Override public Object get(int index) { // TODO Auto-generated method stub rangeCheckExist(index); return elementData[index]; } @Override public Object remove(int index) { // TODO Auto-generated method stub rangeCheckExist(index); Object oldValue = elementData[index]; //deal with copy operation int moveStep = size - index - 1; if ( moveStep > 0 ) System.arraycopy(elementData, index+1, elementData, index,moveStep); elementData[--size] = null; // clear to let GC do its work return oldValue; } @Override public int size() { // TODO Auto-generated method stub return this.size; } //Get Iterator public Iterator iterator() { return new ArrayListIterator(); } /******* Iterator *******/ private class ArrayListIterator implements Iterator{ private int currentIndex = 0; @Override public boolean hasNext() { return currentIndex < size(); } @Override public Object next() { rangeCheckExist(currentIndex); return elementData[currentIndex++]; } } /*******Inner function*******/ //Increase arraylist size private void adjustCapacity(){ //array length can not satisfy data size; if ( this.array_len < size() + 1 ) { this.array_len *= 2; this.elementData = Arrays.copyOf(elementData, array_len); } else { return ; } } private void rangeCheckForAdd(int index) { //Add operation is allow to add value in [ size() ] even if [ size() ] has not data if ( index > size() || index < 0 ) throw new IndexOutOfBoundsException("Invalid Adding Index:"+index); } private void rangeCheckExist(int index) { if ( index >= size() || index < 0 ) throw new IndexOutOfBoundsException("Invalid Index:"+index); } }