package com.github.congcongcong250.coding2017.basic;
import java.util.Arrays;
import java.util.InputMismatchException;
import java.util.NoSuchElementException;
public class WArrayList implements WList {
private int size = 0;
private Object[] elementData = new Object[10];
public void add(Object o){
//check size limit
if(size + 1 > elementData.length){
int newlength = elementData.length * 3 / 2 + 1;
elementData = Arrays.copyOf(elementData, newlength);
}
elementData[size++] = o;
}
public void add(int index, Object o){
//index Check
checkIndex(index);
//check size limit
if(size + 1 > elementData.length){
int newlength = elementData.length * 3 / 2 + 1;
elementData = Arrays.copyOf(elementData, newlength);
}
for(int i = ++size; i >= index; i-- ){
elementData[i] = elementData[i-1];
}
elementData[index] = o;
}
public Object get(int index){
//index Check
checkIndex(index);
return elementData[index];
}
public Object remove(int index){
//index Check
checkIndex(index);
Object old = elementData[index];
for(int i = index; i < size-1 ; i++ ){
elementData[i] = elementData[i+1];
}
elementData[--size] = null;
return old;
}
public int size(){
return size;
}
public WIterator wIterator(){
return new Itr();
}
public void clear(){
elementData = new Object[10];
size = 0;
}
private void checkIndex(int index){
if(index >= size || index < 0){
throw new IndexOutOfBoundsException("Index:"+index+" Size:"+size);
}
}
private class Itr implements WIterator{
//index for next element to visit
private int cursor = 0;
@Override
public boolean hasNext() {
return cursor != size;
}
@Override
public Object next() {
if(cursor >= size){
throw new NoSuchElementException();
}
return elementData[cursor++];
}
@Override
public void remove() {
//Check bound
if(cursor == 0){
throw new NoSuchElementException();
}
WArrayList.this.remove(--cursor);
}
}
}