package com.coding.basic.array;
import com.coding.basic.Iterator;
import com.coding.basic.List;
public class ArrayList implements List {
private int size = 0;
private Object[] elementData = new Object[100];
public void add(Object o){
if( size <= elementData.length){
elementData[size + 1] = o;
size++;
}else{
elementData = grow(elementData, 1);
elementData[size+1] = o;
size++;
}
}
public void add(int index, Object o){
Object[] temp = new Object[elementData.length];
for(int i = 0; i<elementData.length; i++){
temp[i] = elementData[i];
}
if(index <= size){
elementData = grow(elementData, 1);
elementData[index] = o;
System.arraycopy(temp, index, elementData, index+1, temp.length - index);
size++;
}
}
public Object get(int index){
if(index < elementData.length){
return elementData[index];
}else{
return null;
}
}
public Object remove(int index){
Object[] temp = new Object[elementData.length];
for(int i = 0; i<elementData.length; i++){
temp[i] = elementData[i];
}
if(index < elementData.length){
System.arraycopy(temp, index+1, elementData, index, temp.length - index - 1);
size--;
return elementData;
}else{
return null;
}
}
public int size(){
for(int i = 0; i < elementData.length;i++){
if(elementData[i] != null){
size++;
}
}
return size;
}
public Iterator iterator(){
return new ArrayListIterator(this);
}
private class ArrayListIterator implements Iterator {
ArrayList arraylist = null;
int pos = 0;
private ArrayListIterator(ArrayList arraylist) {
this.arraylist = arraylist;
}
@Override
public boolean hasNext() {
pos++;
if(pos >= size){
return false;
}else{
return true;
}
}
@Override
public Object next() {
return elementData[pos];
}
}
public static Object[] grow(Object[]src, int size){
Object[] target = new Object[src.length + size];
System.arraycopy(src, 0, target, 0, src.length);
return target;
}
}