diff --git a/src/main/java/core/basesyntax/ArrayList.java b/src/main/java/core/basesyntax/ArrayList.java index 8d6477943..0c4029673 100644 --- a/src/main/java/core/basesyntax/ArrayList.java +++ b/src/main/java/core/basesyntax/ArrayList.java @@ -1,48 +1,104 @@ package core.basesyntax; +import java.util.NoSuchElementException; + public class ArrayList implements List { + private static final int DEFAULT_CAPACITY = 10; + private Object[] elementData; + private int size; + + public ArrayList() { + elementData = new Object[DEFAULT_CAPACITY]; + } + + private void ensureCapacity() { + if (size >= elementData.length) { + int newCapacity = elementData.length + (elementData.length >> 1); + Object[] newArray = new Object[newCapacity]; + System.arraycopy(elementData, 0, newArray, 0, elementData.length); + elementData = newArray; + } + } + + private void checkIndex(int index) { + if (index < 0 || index >= size) { + throw new ArrayListIndexOutOfBoundsException("Index: " + index + ", Size: " + size); + } + } + + private void checkIndexForAdd(int index) { + if (index < 0 || index > size) { + throw new ArrayListIndexOutOfBoundsException("Index: " + index + ", Size: " + size); + } + } + @Override public void add(T value) { - + ensureCapacity(); + elementData[size++] = value; } @Override public void add(T value, int index) { - + checkIndexForAdd(index); + ensureCapacity(); + System.arraycopy(elementData, index, elementData, index + 1, size - index); + elementData[index] = value; + size++; } @Override public void addAll(List list) { - + for (int i = 0; i < list.size(); i++) { + add(list.get(i)); + } } + @SuppressWarnings("unchecked") @Override public T get(int index) { - return null; + checkIndex(index); + return (T) elementData[index]; } @Override public void set(T value, int index) { - + checkIndex(index); + elementData[index] = value; } + @SuppressWarnings("unchecked") @Override public T remove(int index) { - return null; + checkIndex(index); + T removedElement = (T) elementData[index]; + int numMoved = size - index - 1; + if (numMoved > 0) { + System.arraycopy(elementData, index + 1, elementData, index, numMoved); + } + elementData[--size] = null; // Clear the last element + return removedElement; } @Override public T remove(T element) { - return null; + for (int i = 0; i < size; i++) { + if (elementData[i] == null ? element == null : elementData[i].equals(element)) { + T removed = (T) elementData[i]; + remove(i); + return removed; + } + } + throw new NoSuchElementException("Element not found: " + element); } @Override public int size() { - return 0; + return size; } @Override public boolean isEmpty() { - return false; + return size == 0; } }