Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 1e684ec

Browse files
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)

AltStyle によって変換されたページ (->オリジナル) /