Skip to content

Commit 1e684ec

Browse files
committed
CustomArrayList: implement Collection instead of Iterable
1 parent 450c3e2 commit 1e684ec

File tree

2 files changed

+226
-7
lines changed

2 files changed

+226
-7
lines changed

src/main/java/by/andd3dfx/collections/custom/CustomArrayList.java

Lines changed: 94 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,13 @@
33
import lombok.RequiredArgsConstructor;
44

55
import java.util.Arrays;
6+
import java.util.Collection;
67
import java.util.Iterator;
78

89
/**
910
* @see <a href="https://youtu.be/u7Vyh567ljs">Video solution</a>
1011
*/
11-
public class CustomArrayList<T> implements Iterable<T> {
12+
public class CustomArrayList<T> implements Collection<T> {
1213

1314
private static final int DEFAULT_INITIAL_SIZE = 10;
1415
private static final float RESIZE_FACTOR = 1.75f;
@@ -41,8 +42,9 @@ public void set(int index, T value) {
4142
array[index] = value;
4243
}
4344

44-
public void add(T value) {
45+
public boolean add(T value) {
4546
add(size, value);
47+
return true;
4648
}
4749

4850
public void add(int index, T value) {
@@ -97,7 +99,7 @@ public T remove(int index) {
9799
return result;
98100
}
99101

100-
public boolean remove(T value) {
102+
public boolean remove(Object value) {
101103
var i = 0;
102104
while (i < size) {
103105
T currValue = array[i];
@@ -110,7 +112,77 @@ public boolean remove(T value) {
110112
return false;
111113
}
112114

113-
private boolean checkEquality(T value1, T value2) {
115+
@Override
116+
public boolean contains(Object o) {
117+
for (var item : array) {
118+
if (item == o) {
119+
return true;
120+
}
121+
}
122+
return false;
123+
}
124+
125+
@Override
126+
public boolean containsAll(Collection<?> c) {
127+
for (var item : c) {
128+
if (!contains(item)) {
129+
return false;
130+
}
131+
}
132+
return true;
133+
}
134+
135+
@Override
136+
public boolean addAll(Collection<? extends T> c) {
137+
if (c.isEmpty()) {
138+
return false;
139+
}
140+
141+
var incomingArray = c.toArray();
142+
if (array.length >= size + c.size()) {
143+
System.arraycopy(incomingArray, 0, array, size, c.size());
144+
} else {
145+
int oldLength = array.length;
146+
var newLength = oldLength;
147+
while (newLength < size + c.size()) {
148+
newLength *= RESIZE_FACTOR;
149+
}
150+
var newArray = (T[]) new Object[newLength];
151+
System.arraycopy(array, 0, newArray, 0, size);
152+
array = newArray;
153+
System.arraycopy(incomingArray, 0, array, size, c.size());
154+
}
155+
return true;
156+
}
157+
158+
@Override
159+
public boolean removeAll(Collection<?> c) {
160+
var result = false;
161+
for (var item : c) {
162+
if (remove(item)) {
163+
result = true;
164+
}
165+
}
166+
return result;
167+
}
168+
169+
@Override
170+
public boolean retainAll(Collection<?> c) {
171+
var result = false;
172+
173+
var i = 0;
174+
while (i < size) {
175+
if (!c.contains(array[i])) {
176+
remove(i);
177+
result = true;
178+
} else {
179+
i++;
180+
}
181+
}
182+
return result;
183+
}
184+
185+
private boolean checkEquality(Object value1, Object value2) {
114186
if (value1 == null) {
115187
return value2 == null;
116188
}
@@ -132,6 +204,24 @@ public Iterator<T> iterator() {
132204
return new CustomIterator(array, size);
133205
}
134206

207+
@Override
208+
public Object[] toArray() {
209+
return Arrays.copyOf(array, size);
210+
}
211+
212+
@Override
213+
public <T1> T1[] toArray(T1[] a) {
214+
if (a.length < size) {
215+
return (T1[]) Arrays.copyOf(array, size, a.getClass());
216+
}
217+
218+
System.arraycopy(array, 0, a, 0, size);
219+
if (a.length > size) {
220+
a[size] = null;
221+
}
222+
return a;
223+
}
224+
135225
@RequiredArgsConstructor
136226
public class CustomIterator<E> implements Iterator<E> {
137227
private final E[] array;

src/test/java/by/andd3dfx/collections/custom/CustomArrayListTest.java

Lines changed: 132 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,9 @@ public void addNGet() {
1919
CustomArrayList<Integer> list = new CustomArrayList<>();
2020
assertThat(list.size()).isEqualTo(0);
2121
assertTrue(list.isEmpty());
22-
list.add(4);
23-
list.add(5);
24-
list.add(12);
22+
assertTrue(list.add(4));
23+
assertTrue(list.add(5));
24+
assertTrue(list.add(12));
2525

2626
assertThat(list.size()).isEqualTo(3);
2727
assertFalse(list.isEmpty());
@@ -329,4 +329,133 @@ public void testToString() {
329329

330330
assertThat(list.toString()).isEqualTo("[Andrei, Tikhon, Ilya]");
331331
}
332+
333+
@Test
334+
public void testContains() {
335+
CustomArrayList<String> list = new CustomArrayList<>();
336+
list.add("Andrei");
337+
list.add("Tikhon");
338+
list.add("Ilya");
339+
340+
assertThat(list.contains("Tikhon")).isTrue();
341+
assertThat(list.contains("Andrei")).isTrue();
342+
assertThat(list.contains("Isaac")).isFalse();
343+
}
344+
345+
@Test
346+
public void testContainsAll() {
347+
CustomArrayList<String> list = new CustomArrayList<>();
348+
list.add("Andrei");
349+
list.add("Tikhon");
350+
list.add("Ilya");
351+
352+
assertThat(list.containsAll(List.of())).isTrue();
353+
assertThat(list.containsAll(List.of("Ilya", "Tikhon"))).isTrue();
354+
assertThat(list.containsAll(List.of("Ilya", "Pavel"))).isFalse();
355+
}
356+
357+
@Test
358+
public void testAddAllNoResize() {
359+
CustomArrayList<String> list = new CustomArrayList<>();
360+
list.add("Andrei");
361+
list.add("Tikhon");
362+
list.add("Ilya");
363+
364+
list.addAll(List.of("Taisia", "Nika"));
365+
366+
assertThat(list.contains("Andrei")).isTrue();
367+
assertThat(list.contains("Tikhon")).isTrue();
368+
assertThat(list.contains("Ilya")).isTrue();
369+
assertThat(list.contains("Taisia")).isTrue();
370+
assertThat(list.contains("Nika")).isTrue();
371+
}
372+
373+
@Test
374+
public void testAddAllResizeRequired() {
375+
CustomArrayList<String> list = new CustomArrayList<>();
376+
list.add("Andrei");
377+
list.add("Tikhon");
378+
list.add("Ilya");
379+
380+
list.addAll(List.of("Taisia", "Nika", "Taisia", "Nika", "Taisia", "Alexey", "Taisia", "Nika"));
381+
382+
assertThat(list.contains("Andrei")).isTrue();
383+
assertThat(list.contains("Tikhon")).isTrue();
384+
assertThat(list.contains("Ilya")).isTrue();
385+
assertThat(list.contains("Taisia")).isTrue();
386+
assertThat(list.contains("Nika")).isTrue();
387+
assertThat(list.contains("Alexey")).isTrue();
388+
}
389+
390+
@Test
391+
public void testRemoveAll() {
392+
CustomArrayList<String> list = new CustomArrayList<>();
393+
list.add("Andrei");
394+
list.add("Tikhon");
395+
list.add("Ilya");
396+
397+
list.removeAll(List.of("Nina", "Ilya"));
398+
399+
assertThat(list.contains("Andrei")).isTrue();
400+
assertThat(list.contains("Tikhon")).isTrue();
401+
assertThat(list.contains("Ilya")).isFalse();
402+
assertThat(list.size()).isEqualTo(2);
403+
}
404+
405+
@Test
406+
public void testRetainAll() {
407+
CustomArrayList<String> list = new CustomArrayList<>();
408+
list.add("Andrei");
409+
list.add("Tikhon");
410+
list.add("Ilya");
411+
412+
list.retainAll(List.of("Tikhon", "Nina", "Andrei"));
413+
414+
assertThat(list.contains("Andrei")).isTrue();
415+
assertThat(list.contains("Tikhon")).isTrue();
416+
assertThat(list.size()).isEqualTo(2);
417+
}
418+
419+
@Test
420+
public void testToArray() {
421+
CustomArrayList<String> list = new CustomArrayList<>();
422+
list.add("Andrei");
423+
list.add("Tikhon");
424+
list.add("Ilya");
425+
426+
Object[] result = list.toArray();
427+
428+
assertThat(result[0]).isEqualTo("Andrei");
429+
assertThat(result[1]).isEqualTo("Tikhon");
430+
assertThat(result[2]).isEqualTo("Ilya");
431+
}
432+
433+
@Test
434+
public void testToArrayTyped() {
435+
CustomArrayList<String> list = new CustomArrayList<>();
436+
list.add("Andrei");
437+
list.add("Tikhon");
438+
list.add("Ilya");
439+
440+
String[] result = list.toArray(new String[0]);
441+
442+
assertThat(result[0]).isEqualTo("Andrei");
443+
assertThat(result[1]).isEqualTo("Tikhon");
444+
assertThat(result[2]).isEqualTo("Ilya");
445+
}
446+
447+
@Test
448+
public void testToArrayTypedWhenLongArrayPassedAsParameter() {
449+
CustomArrayList<String> list = new CustomArrayList<>();
450+
list.add("Andrei");
451+
list.add("Tikhon");
452+
list.add("Ilya");
453+
454+
String[] result = list.toArray(new String[]{"a", "b", "c", "d"});
455+
456+
assertThat(result[0]).isEqualTo("Andrei");
457+
assertThat(result[1]).isEqualTo("Tikhon");
458+
assertThat(result[2]).isEqualTo("Ilya");
459+
assertThat(list.size()).isEqualTo(3);
460+
}
332461
}

0 commit comments

Comments
 (0)