diff --git a/src/main/java/core/basesyntax/Application.java b/src/main/java/core/basesyntax/Application.java new file mode 100644 index 000000000..9a76f2ff1 --- /dev/null +++ b/src/main/java/core/basesyntax/Application.java @@ -0,0 +1,14 @@ +package core.basesyntax; + +public class Application { + public static void main(String[] args) { + List list = new ArrayList<>(); + list.add("First"); + list.add("Second"); + list.add("Third"); + + System.out.println("List size: " + list.size()); + System.out.println("Element at index 1: " + list.get(1)); + } + +} diff --git a/src/main/java/core/basesyntax/ArrayList.java b/src/main/java/core/basesyntax/ArrayList.java index 8d6477943..f524d6448 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 T[] elements; + private int size; + + public ArrayList() { + elements = (T[]) new Object[DEFAULT_CAPACITY]; + } + @Override public void add(T value) { - + if (size == elements.length) { + grow(); + } + elements[size++] = value; } @Override public void add(T value, int index) { - + if (index < 0 || index > size) { + throw new ArrayListIndexOutOfBoundsException("Index: " + index + ", Size: " + size); + } + if (size == elements.length) { + grow(); + } + System.arraycopy(elements, index, elements, index + 1, size - index); + elements[index] = value; + size++; } @Override public void addAll(List list) { - + for (int i = 0; i < list.size(); i++) { + add(list.get(i)); + } } @Override public T get(int index) { - return null; + checkIndex(index); + return elements[index]; } @Override public void set(T value, int index) { - + checkIndex(index); + elements[index] = value; } @Override public T remove(int index) { - return null; + checkIndex(index); + T removedElement = elements[index]; + System.arraycopy(elements, index + 1, elements, index, size - index - 1); + size--; + return removedElement; } @Override public T remove(T element) { - return null; + int index = -1; + for (int i = 0; i < size; i++) { + if (elements[i] == null && element == null + || elements[i] != null && elements[i].equals(element)) { + index = i; + break; + } + } + if (index == -1) { + throw new NoSuchElementException("Element not found in the list"); + } + return remove(index); } @Override public int size() { - return 0; + return size; } @Override public boolean isEmpty() { - return false; + return size == 0; + } + + private void grow() { + int newCapacity = (int) (elements.length * 1.5); + if (newCapacity == elements.length) { + newCapacity++; + } + T[] newElements = (T[]) new Object[newCapacity]; + System.arraycopy(elements, 0, newElements, 0, size); + elements = newElements; + } + + private void checkIndex(int index) { + if (index < 0 || index >= size) { + throw new ArrayListIndexOutOfBoundsException("Index: " + index + ", Size: " + size); + } } }