package com.coderising.array;
import java.util.Arrays;
import com.coding.basic.Iterator;
import com.coding.basic.List;
public class ArrayList implements List {
private int size = 0;
private static final int GROW_BY_SIZE = 10;
private Object[] elementData = new Object[GROW_BY_SIZE];
public void add(Object o){
if(size == elementData.length){
grow();
}
elementData[size]=o;
size++;
}
public void add(int index, Object o){
validate(index);
if(size == elementData.length){
grow();
}
for(int i=size;i>index+1;i--){
elementData[i]=elementData[i-1];
}
elementData[index]=o;
size++;
}
public Object get(int index){
validate(index);
return elementData[index];
}
public Object remove(int index){
validate(index);
Object result = elementData[index];
for(int i =index;i<size-1;i++){
elementData[i]=elementData[i+1];
}
elementData[size-1]=null;
size--;
return result;
}
public int size(){
return size;
}
public Iterator iterator(){
return new ArrayListIterator();
}
private class ArrayListIterator implements Iterator{
int pos=0;
@Override
public boolean hasNext() {
return pos<size;
}
@Override
public Object next() {
if(pos>=size)throw new IndexOutOfBoundsException("Invalid Index:"+pos);
Object result = elementData[pos];
pos++;
return result;
}
}
private void grow(){
elementData = Arrays.copyOf(elementData, elementData.length+GROW_BY_SIZE);
}
private void validate(int index){
if(index<0||index>=size)throw new IndexOutOfBoundsException("Invalid Index:"+index);
}
@Override
public String toString(){
StringBuilder sb = new StringBuilder("[");
for(int i=0;i<size;i++){
if(sb.length()>1)sb.append(",");
sb.append(elementData[i]);
}
sb.append("]size=").append(this.size());
return sb.toString();
}
public static void main(String[] args){
ArrayList l = new ArrayList();
for(int i=0;i<12;i++){
l.add(i+"");
}
System.out.println(l);
l.add("aaa");
System.out.println("After adding aaa:"+l);
l.add(2,"bbb");
System.out.println("After adding bbb:"+l);
System.out.println(l.get(2));
System.out.println("After getting:"+l);
System.out.println(l.remove(2));
System.out.println("After removing:"+l);
Iterator it = l.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
}