interface ListDemo<E> {
public boolean add(E e);
public void add(int i, E e);
public Object remove(int index);
public boolean remove(E object);
}
class ArrayListDemo<E> implements ListDemo<E> {
private static final int DEFAULT_CAP = 10;
private transient Object[] ele;
private int size;
public ArrayListDemo(int cap) {
if (cap > 0) {
ele = new Object[cap];
} else if (cap == 0) {
ele = new Object[]{};
} else {
throw new IllegalArgumentException("Illegal Capacity: " + cap);
}
}
public ArrayListDemo() {
this(DEFAULT_CAP);
}
public int size() {
return size;
}
public boolean isEmpty() {
return size == 0;
}
public boolean add(E o) {
add(o, ele, size);
return true;
}
private void add(E o, Object[] ele, int s) {
if (s == ele.length) {
ele = grow(size + 1);
}
ele[s] = o;
size = s + 1;
}
public void add(int index, E o) {
Objects.checkIndex(index, size);
Object[] ele;
final int s;
if ((s = size) != (ele = this.ele).length)
ele = grow(size + 1);
System.arraycopy(ele, index, ele, index + 1, s - index);
ele[index] = o;
size = s + 1;
}
public Object get(int index) {
Objects.checkIndex(index, size);
return ele[index];
}
public Object set(int index, E o) {
Objects.checkIndex(index, size);
Object old = ele[index];
ele[index] = o;
return old;
}
public Object remove(int index) {
Objects.checkIndex(index, size);
Object old = ele[index];
int numMoved = size - index - 1;
if (numMoved > 0)
System.arraycopy(ele, index + 1, ele, index,
numMoved);
ele[--size] = null;
return old;
}
public boolean remove(E o) {
for (int i = 0; i < ele.length; i++) {
Object element = ele[i];
if ((element == null && o == null) || (element != null && element.equals(o))) {
remove(i);
return true;
}
}
return false;
}
public Object[] grow(int minCap) {
return ele = Arrays.copyOf(ele, newCap(minCap));
}
private int newCap(int minCap) {
int oldCap = ele.length;
int newCap = oldCap + (oldCap >> 1);
if (newCap - minCap <= 0) {
return minCap;
}
return newCap;
}
}