package com.coding.refactor.List;
public class MyArrayList<T> implements MyList<T>{
private int size = 0;
private Object[] dataArray = new Object[0];
@Override
public int size() {
return size;
}
@Override
public boolean isEmpty() {
return size == 0;
}
@Override
public void add(T o) {
ensureCapacity(size + 1);
dataArray[size++] = o;
}
@Override
public void add(int index, T o) {
if(index < 0 || index >= size){
throw new IndexOutOfBoundsException(OutOfBoundsMsg(index));
}
ensureCapacity(size + 1);
System.arraycopy(dataArray, index, dataArray, index + 1, size - index);
dataArray[index] = o;
}
@Override
public boolean contains(Object o) {
for(Object ele : dataArray){
if(o.equals(ele)){
return true;
}
}
return false;
}
@Override
public Object[] toArray() {
Object[] newArray = new Object[size];
System.arraycopy(dataArray, 0, newArray, 0, size);
return newArray;
}
@Override
public boolean remove(T o) {
int index = indexOf(o);
if(index < 0){
return false;
}
System.arraycopy(dataArray, index + 1, dataArray, index, size - 1 - index);
dataArray[--size] = null;
return true;
}
@Override
public T remove(int index) {
if(index < 0 || index >= size){
throw new IndexOutOfBoundsException(OutOfBoundsMsg(index));
}
T ele = (T)dataArray[index];
System.arraycopy(dataArray, index, dataArray, index+1, size-1-index);
dataArray[--size] = null;
return ele;
}
@Override
public T get(int index) {
if(index < 0 || index >= size){
throw new IndexOutOfBoundsException(OutOfBoundsMsg(index));
}
T ele = (T)dataArray[index];
return ele;
}
@Override
public T set(int index, T element) {
if(index < 0 || index >= size){
throw new IndexOutOfBoundsException(OutOfBoundsMsg(index));
}
dataArray[index] = element;
return element;
}
@Override
public void clear() {
for(int i=0; i<size; i++){
dataArray[i] = null;
}
size = 0;
}
@Override
public int indexOf(T o) {
for(int i=0; i<dataArray.length; i++){
if(o.equals(dataArray[i])){
return i;
}
}
return -1;
}
@Override
public MyIterator<T> iterator() {
// TODO Auto-generated method stub
return null;
}
private void ensureCapacity(int minCapacity) {
if(minCapacity > dataArray.length){
int newCapacity = Math.max(minCapacity, dataArray.length * 2);
Object[] newDataArray = new Object[newCapacity];
System.arraycopy(dataArray, 0, newDataArray, 0, dataArray.length);
dataArray = newDataArray;
}
}
private String OutOfBoundsMsg(int index) {
return "Index: "+index+", Size: "+size;
}
}