package com.interview.basics.model.collection.list; import java.util.Iterator; /** * Created_By: stefanie * Date: 14-7-1 * Time: 下午11:08 */ public class ArrayList<T> implements List<T> { static int N = 2; T[] array = (T[]) new Object[N]; int size = 0; @Override public void add(T element) { add(size, element); } @Override public void add(int index, T element) { if(size == array.length - 1) expand(); int i = size > 0 ? size - 1 : size; for (; i > index; i--) array[i + 1] = array[i]; array[index] = element; size++; } @Override public T get(int index) { return checkIndex(index)? array[index]: null; } @Override public void set(int index, T element) { if(checkIndex(index)) array[index] = element; } @Override public int indexOf(T element) { for(int i = 0; i < size; i++){ if(array[i].equals(element)) return i; } return -1; } @Override public boolean contains(T element) { return indexOf(element) >= 0; } public T delete(int index){ if(!checkIndex(index)) return null; T temp = array[index]; for (int i = index; i < size - 1; i++) { array[i] = array[i + 1]; } size--; if (size < array.length / 4) shrink(); return temp; } @Override public T remove(int index) { return delete(index); } @Override public T remove(T element) { int index = indexOf(element); return remove(index); } @Override public int size() { return size; } @Override public boolean isEmpty() { return size <= 0; } @Override public T[] toArray() { T[] arr = (T[]) new Object[size]; for(int i = 0; i < size; i++){ arr[i] = array[i]; } return arr; } @Override public Iterator<T> iterator() { return new Iterator<T>() { int cursor = -1; @Override public boolean hasNext() { return cursor + 1 < size; } @Override public T next() { return array[++cursor]; } @Override public void remove() { delete(cursor); } }; } @Override public void addAll(List<T> list) { Iterator<T> itr = list.iterator(); while(itr.hasNext()){ this.add(itr.next()); } } @Override public void clear() { for(int i = 0; i < size; i++) array[i] = null; size = 0; } private void expand(){ N*=2; copy(); } private void shrink(){ N = N / 2; copy(); } private void copy(){ T[] newArray = (T[]) new Object[N]; for(int i = 0; i < size; i++){ newArray[i] = array[i]; } array = newArray; } private boolean checkIndex(int index){ if(index >= 0 && index < size) return true; else return false; } }