package com.coding.basic.array;
import com.coding.basic.Iterator;
import com.coding.basic.List;
import java.util.Objects;
public class ArrayList<T> implements List<T> {
private int size;
private Object[] dataArray = new Object[0];
public int size() {
return this.size;
}
public boolean isEmpty() {
return this.size == 0;
}
public boolean contains(Object o) {
for (Object obj : dataArray) {
if (Objects.equals(obj, o)){
return true;
}
}
return false;
}
public Object[] toArray() {
Object[] array = new Object[size];
System.arraycopy(dataArray, 0, array, 0, size);
return array;
}
public boolean add(T o) {
ensureCapacity(size+1);
dataArray[size] = o;
size++;
return true;
}
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 - 1] = null;
size--;
return true;
}
public void clear() {
for (int i = 0; i < size; i++) {
dataArray[i] = null;
}
size = 0;
}
@SuppressWarnings("unchecked")
public T get(int index) {
if (index < 0 || index >= size){
throw new IndexOutOfBoundsException();
}
return (T) dataArray[index];
}
public T set(int index, T o) {
if (index < 0 || index >= size){
throw new IndexOutOfBoundsException();
}
dataArray[index] = o;
return o;
}
public void add(int index, T o) {
if (index < 0 || index > size) {
throw new IndexOutOfBoundsException();
}
ensureCapacity(size + 1);
System.arraycopy(dataArray, index, dataArray, index + 1, size - index);
dataArray[index] = o;
size++;
}
public T remove(int index) {
if (index < 0 || index >= size) {
throw new IndexOutOfBoundsException();
}
T removeData = (T) dataArray[index];
System.arraycopy(dataArray, index + 1, dataArray, index, size - index -1 );
dataArray[size - 1] = null;
size--;
return removeData;
}
public int indexOf(T o) {
for (int i = 0; i < size; i++) {
if (Objects.equals(o, dataArray[i])){
return i;
}
}
return -1;
}
public Iterator<T> iterator() {
return new ArrayListIterator();
}
@Override
public void printf() {
for (int i = 0; i < size; i++) {
if (i == size - 1){
System.out.print(dataArray[i]);
}else {
System.out.print(dataArray[i] + "->");
}
}
}
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 class ArrayListIterator implements Iterator<T> {
private int pos;
@Override
public boolean hasNext() {
return pos < size();
}
@Override
public T next() {
if (hasNext()){
return get(pos++);
}
return null;
}
}
}