package com.ecust.test;
import java.util.*;
public class GArrayList<T> implements GList<T> {
private int size;
private Object[] dataArray= new Object[0];
@Override
public int size() {
return this.size;
}
@Override
public boolean isEmpty() {
return this.size == 0;
}
@Override
public boolean contains(Object o) {
for(Object obj:dataArray) {
if(Objects.equals(obj, o))
return true;
}
return false;
}
@Override
public Object[] toArray() {
Object[] array = new Object[size];
System.arraycopy(dataArray, 0, array, 0, size);
return array;
}
@Override
public boolean add(T t) {
ensureCapacity(size+1);
dataArray[size] = t;
size++;
return true;
}
@Override
public boolean remove(T t) {
int index = indexof(t);
if(index < 0) {
return false;
}
System.arraycopy(dataArray, index+1, dataArray, index, size-1-index);
dataArray[size-1] = null;
size--;
return true;
}
@Override
public void clear() {
dataArray = new Object[size];
size = 0;
}
@Override
public T get(int index) {
if(index < -1 || index >= size) {
throw new IndexOutOfBoundsException();
}
return (T)dataArray[index];
}
@Override
public T set(int index, T t) {
if(index < -1 || index >= size) {
throw new IndexOutOfBoundsException();
}
dataArray[index] = t;
return t;
}
@Override
public void add(int index, T t) {
if(index < -1 || index >= size) {
throw new IndexOutOfBoundsException();
}
ensureCapacity(size+1);
System.arraycopy(dataArray, index, dataArray, index+1, size-index);
dataArray[index] = t;
size++;
}
@Override
public T remove(int index) {
if(index < -1 || index >= size) {
throw new IndexOutOfBoundsException();
}
T element = (T)dataArray[index];
System.arraycopy(dataArray, index+1, dataArray, index, size-1-index);
dataArray[size-1] = null;
size--;
return element;
}
@Override
public int indexof(T t) {
for(int i = 0;i<size;i++) {
if(Objects.equals(t, dataArray[i])) {
return i;
}
}
return -1;
}
@Override
public GIterator<T> iterator() {
return new ArrayListIterator(this);
}
private void ensureCapacity(int i) {
if(i > dataArray.length) {
int newlength = Math.max(i, dataArray.length*2);
Object[] newDataArray = new Object[newlength];
System.arraycopy(dataArray, 0, newDataArray, 0, dataArray.length);
dataArray = newDataArray;
}
}
private class ArrayListIterator implements GIterator<T> {
private int position;
private GArrayList<T> list;
ArrayListIterator(GArrayList<T> list) {
this.list = list;
}
@Override
public boolean hasNext() {
return position < list.size;
}
@Override
public T next() {
if(hasNext()) {
return list.get(position++);
}
return null;
}
}
}