From 9a0e3099df9f1b1bac8e914222c758727e4beb5f Mon Sep 17 00:00:00 2001 From: Maksym Musiienko Date: Wed, 8 Nov 2023 11:05:21 +0200 Subject: [PATCH 1/3] created own ArrayList collection which implements our List interface and uses custom exeption --- src/main/java/core/basesyntax/ArrayList.java | 71 +++++++++++++++++--- 1 file changed, 62 insertions(+), 9 deletions(-) diff --git a/src/main/java/core/basesyntax/ArrayList.java b/src/main/java/core/basesyntax/ArrayList.java index 8d6477943..e1ec75ce1 100644 --- a/src/main/java/core/basesyntax/ArrayList.java +++ b/src/main/java/core/basesyntax/ArrayList.java @@ -1,48 +1,101 @@ package core.basesyntax; +import java.util.Arrays; +import java.util.NoSuchElementException; + public class ArrayList implements List { + private static final int DEFAULT_CAPACITY = 10; + private Object[] elements; + private int size; + + public ArrayList() { + this.elements = new Object[DEFAULT_CAPACITY]; + } + + private void ensureCapacity() { + if (size == elements.length) { + int newCapacity = (int) (elements.length * 1.5); + elements = Arrays.copyOf(elements, newCapacity); + } + } + @Override public void add(T value) { - + ensureCapacity(); + elements[size++] = value; } @Override public void add(T value, int index) { - + if (index < 0 || index > size) { + throw new ArrayListIndexOutOfBoundsException("Index: " + index + ", Size: " + size); + } + ensureCapacity(); + 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; + if (index < 0 || index >= size) { + throw new ArrayListIndexOutOfBoundsException("Index: " + index + ", Size: " + size); + } + return (T) elements[index]; } @Override public void set(T value, int index) { - + if (index < 0 || index >= size) { + throw new ArrayListIndexOutOfBoundsException("Index: " + index + ", Size: " + size); + } + elements[index] = value; } @Override public T remove(int index) { - return null; + if (index < 0 || index >= size) { + throw new ArrayListIndexOutOfBoundsException("Index: " + index + ", Size: " + size); + } + T removedValue = (T) elements[index]; + System.arraycopy(elements, index + 1, elements, index, size - index - 1); + elements[--size] = null; + return removedValue; } @Override public T remove(T element) { - return null; + if (element == null) { + for (int i = 0; i < size; i++) { + if (elements[i] == null) { + return remove(i); + } + } + throw new NoSuchElementException("Element not found"); + } + + for (int i = 0; i < size; i++) { + if (element.equals(elements[i])) { + return remove(i); + } + } + throw new NoSuchElementException("Element not found"); } @Override public int size() { - return 0; + return size; } @Override public boolean isEmpty() { - return false; + return size == 0; } } From a14b4b93514b419f90281af0872f19ced220fd59 Mon Sep 17 00:00:00 2001 From: Maksym Musiienko Date: Wed, 8 Nov 2023 20:24:17 +0200 Subject: [PATCH 2/3] now dont use Arrays in class --- src/main/java/core/basesyntax/ArrayList.java | 38 +++++++++++++------- 1 file changed, 26 insertions(+), 12 deletions(-) diff --git a/src/main/java/core/basesyntax/ArrayList.java b/src/main/java/core/basesyntax/ArrayList.java index e1ec75ce1..f062f2f5e 100644 --- a/src/main/java/core/basesyntax/ArrayList.java +++ b/src/main/java/core/basesyntax/ArrayList.java @@ -1,10 +1,10 @@ package core.basesyntax; -import java.util.Arrays; import java.util.NoSuchElementException; public class ArrayList implements List { private static final int DEFAULT_CAPACITY = 10; + private static final double RESIZE_COEFFICIENT = 1.5; private Object[] elements; private int size; @@ -12,13 +12,6 @@ public ArrayList() { this.elements = new Object[DEFAULT_CAPACITY]; } - private void ensureCapacity() { - if (size == elements.length) { - int newCapacity = (int) (elements.length * 1.5); - elements = Arrays.copyOf(elements, newCapacity); - } - } - @Override public void add(T value) { ensureCapacity(); @@ -28,7 +21,9 @@ public void add(T value) { @Override public void add(T value, int index) { if (index < 0 || index > size) { - throw new ArrayListIndexOutOfBoundsException("Index: " + index + ", Size: " + size); + throw new ArrayListIndexOutOfBoundsException("Index outed of bounds, Index: " + index + + ", Size: " + + size); } ensureCapacity(); System.arraycopy(elements, index, elements, index + 1, size - index); @@ -46,7 +41,9 @@ public void addAll(List list) { @Override public T get(int index) { if (index < 0 || index >= size) { - throw new ArrayListIndexOutOfBoundsException("Index: " + index + ", Size: " + size); + throw new ArrayListIndexOutOfBoundsException("Index outed of bounds, Index: " + index + + ", Size: " + + size); } return (T) elements[index]; } @@ -54,7 +51,9 @@ public T get(int index) { @Override public void set(T value, int index) { if (index < 0 || index >= size) { - throw new ArrayListIndexOutOfBoundsException("Index: " + index + ", Size: " + size); + throw new ArrayListIndexOutOfBoundsException("Index outed of bounds, Index: " + index + + ", Size: " + + size); } elements[index] = value; } @@ -62,7 +61,9 @@ public void set(T value, int index) { @Override public T remove(int index) { if (index < 0 || index >= size) { - throw new ArrayListIndexOutOfBoundsException("Index: " + index + ", Size: " + size); + throw new ArrayListIndexOutOfBoundsException("Index outed of bounds, Index: " + index + + ", Size: " + + size); } T removedValue = (T) elements[index]; System.arraycopy(elements, index + 1, elements, index, size - index - 1); @@ -98,4 +99,17 @@ public int size() { public boolean isEmpty() { return size == 0; } + + private void resize() { + int newCapacity = (int) (elements.length * RESIZE_COEFFICIENT); + Object[] newElements = new Object[newCapacity]; + System.arraycopy(elements, 0, newElements, 0, size); + elements = newElements; + } + + private void ensureCapacity() { + if (size == elements.length) { + resize(); + } + } } From 2c8f09e35dd4c1d5a38e94bba24b115fd75987c7 Mon Sep 17 00:00:00 2001 From: Maksym Musiienko Date: Wed, 8 Nov 2023 21:55:39 +0200 Subject: [PATCH 3/3] did all expected changes --- src/main/java/core/basesyntax/ArrayList.java | 58 +++++++++----------- 1 file changed, 25 insertions(+), 33 deletions(-) diff --git a/src/main/java/core/basesyntax/ArrayList.java b/src/main/java/core/basesyntax/ArrayList.java index f062f2f5e..dc56836f8 100644 --- a/src/main/java/core/basesyntax/ArrayList.java +++ b/src/main/java/core/basesyntax/ArrayList.java @@ -5,11 +5,11 @@ public class ArrayList implements List { private static final int DEFAULT_CAPACITY = 10; private static final double RESIZE_COEFFICIENT = 1.5; - private Object[] elements; + private T[] elements; private int size; public ArrayList() { - this.elements = new Object[DEFAULT_CAPACITY]; + this.elements = (T[]) new Object[DEFAULT_CAPACITY]; } @Override @@ -20,11 +20,7 @@ public void add(T value) { @Override public void add(T value, int index) { - if (index < 0 || index > size) { - throw new ArrayListIndexOutOfBoundsException("Index outed of bounds, Index: " + index - + ", Size: " - + size); - } + checkAddBounds(index); ensureCapacity(); System.arraycopy(elements, index, elements, index + 1, size - index); elements[index] = value; @@ -40,31 +36,19 @@ public void addAll(List list) { @Override public T get(int index) { - if (index < 0 || index >= size) { - throw new ArrayListIndexOutOfBoundsException("Index outed of bounds, Index: " + index - + ", Size: " - + size); - } + checkBounds(index); return (T) elements[index]; } @Override public void set(T value, int index) { - if (index < 0 || index >= size) { - throw new ArrayListIndexOutOfBoundsException("Index outed of bounds, Index: " + index - + ", Size: " - + size); - } + checkBounds(index); elements[index] = value; } @Override public T remove(int index) { - if (index < 0 || index >= size) { - throw new ArrayListIndexOutOfBoundsException("Index outed of bounds, Index: " + index - + ", Size: " - + size); - } + checkBounds(index); T removedValue = (T) elements[index]; System.arraycopy(elements, index + 1, elements, index, size - index - 1); elements[--size] = null; @@ -73,17 +57,9 @@ public T remove(int index) { @Override public T remove(T element) { - if (element == null) { - for (int i = 0; i < size; i++) { - if (elements[i] == null) { - return remove(i); - } - } - throw new NoSuchElementException("Element not found"); - } - for (int i = 0; i < size; i++) { - if (element.equals(elements[i])) { + if ((element == null && elements[i] == null) + || (element != null && element.equals(elements[i]))) { return remove(i); } } @@ -102,7 +78,7 @@ public boolean isEmpty() { private void resize() { int newCapacity = (int) (elements.length * RESIZE_COEFFICIENT); - Object[] newElements = new Object[newCapacity]; + T[] newElements = (T[]) new Object[newCapacity]; System.arraycopy(elements, 0, newElements, 0, size); elements = newElements; } @@ -112,4 +88,20 @@ private void ensureCapacity() { resize(); } } + + private void checkBounds(int index) { + if (index < 0 || index >= size) { + throw new ArrayListIndexOutOfBoundsException("Index outed of bounds, Index: " + index + + ", Size: " + + size); + } + } + + private void checkAddBounds(int index) { + if (index < 0 || index > size) { + throw new ArrayListIndexOutOfBoundsException("Index outed of bounds, Index: " + index + + ", Size: " + + size); + } + } }