Skip to content

Commit 949b819

Browse files
committed
Implement listIterator methods for CustomArrayList
1 parent 853ca37 commit 949b819

File tree

2 files changed

+145
-11
lines changed

2 files changed

+145
-11
lines changed

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

Lines changed: 76 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import java.util.Iterator;
99
import java.util.List;
1010
import java.util.ListIterator;
11+
import java.util.NoSuchElementException;
1112

1213
/**
1314
* @see <a href="https://youtu.be/u7Vyh567ljs">Video solution part1</a>, <a href="https://youtu.be/VBdYvDW8WL8">part2</a>
@@ -148,14 +149,12 @@ public int lastIndexOf(Object o) {
148149

149150
@Override
150151
public ListIterator<T> listIterator() {
151-
// TODO add implementation
152-
throw new NotImplementedException();
152+
return new CustomListIterator<>(this);
153153
}
154154

155155
@Override
156156
public ListIterator<T> listIterator(int index) {
157-
// TODO add implementation
158-
throw new NotImplementedException();
157+
return new CustomListIterator<>(this, index);
159158
}
160159

161160
@Override
@@ -293,7 +292,7 @@ public String toString() {
293292

294293
@Override
295294
public Iterator<T> iterator() {
296-
return new CustomIterator(array, size);
295+
return new CustomArrayIterator<>(array, size);
297296
}
298297

299298
@Override
@@ -315,11 +314,10 @@ public <T1> T1[] toArray(T1[] a) {
315314
}
316315

317316
@RequiredArgsConstructor
318-
public class CustomIterator<E> implements Iterator<E> {
317+
public static class CustomArrayIterator<E> implements Iterator<E> {
319318

320319
private final E[] array;
321320
private final int size;
322-
323321
private int curr = 0;
324322

325323
@Override
@@ -329,7 +327,78 @@ public boolean hasNext() {
329327

330328
@Override
331329
public E next() {
330+
if (curr == size) {
331+
throw new NoSuchElementException();
332+
}
333+
return array[curr++];
334+
}
335+
}
336+
337+
public static class CustomListIterator<E> implements ListIterator<E> {
338+
339+
private final E[] array;
340+
private final int size;
341+
private int curr;
342+
343+
public CustomListIterator(CustomArrayList<E> list) {
344+
this(list, 0);
345+
}
346+
347+
public CustomListIterator(CustomArrayList<E> list, int index) {
348+
this.array = list.array;
349+
this.size = list.size;
350+
this.curr = index;
351+
}
352+
353+
@Override
354+
public boolean hasNext() {
355+
return curr < size;
356+
}
357+
358+
@Override
359+
public E next() {
360+
if (curr == size) {
361+
throw new NoSuchElementException();
362+
}
332363
return array[curr++];
333364
}
365+
366+
@Override
367+
public boolean hasPrevious() {
368+
return curr > 0;
369+
}
370+
371+
@Override
372+
public E previous() {
373+
if (curr == 0) {
374+
throw new NoSuchElementException();
375+
}
376+
return array[--curr];
377+
}
378+
379+
@Override
380+
public int nextIndex() {
381+
return curr + 1;
382+
}
383+
384+
@Override
385+
public int previousIndex() {
386+
return curr - 1;
387+
}
388+
389+
@Override
390+
public void remove() {
391+
throw new UnsupportedOperationException();
392+
}
393+
394+
@Override
395+
public void set(E e) {
396+
array[curr] = e;
397+
}
398+
399+
@Override
400+
public void add(E e) {
401+
throw new UnsupportedOperationException();
402+
}
334403
}
335404
}

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

Lines changed: 69 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import java.lang.reflect.Field;
88
import java.util.ArrayList;
99
import java.util.List;
10+
import java.util.NoSuchElementException;
1011

1112
import static org.assertj.core.api.Assertions.assertThat;
1213
import static org.junit.Assert.assertFalse;
@@ -482,18 +483,82 @@ public void lastIndexOf() {
482483
assertThat(list.lastIndexOf(null)).isEqualTo(6);
483484
}
484485

486+
@Test
487+
public void iterator() {
488+
var list = new CustomArrayList<String>();
489+
list.add("Andrei");
490+
list.add("Tikhon");
491+
list.add("Nina");
492+
493+
var iterator = list.iterator();
494+
var collectedItems = new ArrayList<String>();
495+
while (iterator.hasNext()) {
496+
collectedItems.add(iterator.next());
497+
}
498+
assertThat(collectedItems).isEqualTo(List.of("Andrei", "Tikhon", "Nina"));
499+
}
500+
485501
@Test
486502
public void listIterator() {
487-
var list = new CustomArrayList<>();
503+
var list = new CustomArrayList<String>();
504+
list.add("Andrei");
505+
list.add("Tikhon");
506+
list.add("Nina");
488507

489-
assertThrows(NotImplementedException.class, list::listIterator);
508+
var iterator = list.listIterator();
509+
var collectedItems = new ArrayList<String>();
510+
while (iterator.hasNext()) {
511+
collectedItems.add(iterator.next());
512+
}
513+
assertThat(collectedItems).isEqualTo(List.of("Andrei", "Tikhon", "Nina"));
514+
}
515+
516+
@Test
517+
public void listIteratorComplex() {
518+
var list = new CustomArrayList<String>();
519+
list.add("Andrei");
520+
list.add("Tikhon");
521+
list.add("Nina");
522+
523+
var iterator = list.listIterator();
524+
var collectedItems = new ArrayList<String>();
525+
collectedItems.add(iterator.next());
526+
collectedItems.add(iterator.next());
527+
collectedItems.add(iterator.previous());
528+
collectedItems.add(iterator.previous());
529+
assertThat(iterator.hasPrevious()).isEqualTo(false);
530+
collectedItems.add(iterator.next());
531+
collectedItems.add(iterator.next());
532+
assertThat(iterator.hasNext()).isEqualTo(true);
533+
collectedItems.add(iterator.next());
534+
assertThat(iterator.hasNext()).isEqualTo(false);
535+
536+
assertThat(collectedItems).isEqualTo(List.of("Andrei", "Tikhon", "Tikhon", "Andrei", "Andrei", "Tikhon", "Nina"));
490537
}
491538

492539
@Test
493540
public void listIteratorWithIndex() {
494-
var list = new CustomArrayList<>();
541+
var list = new CustomArrayList<String>();
542+
list.add("Andrei");
543+
list.add("Tikhon");
544+
list.add("Nina");
495545

496-
assertThrows(NotImplementedException.class, () -> list.listIterator(1));
546+
var iterator = list.listIterator(1);
547+
var collectedItems = new ArrayList<String>();
548+
collectedItems.add(iterator.next());
549+
assertThat(iterator.hasNext()).isEqualTo(true);
550+
collectedItems.add(iterator.next());
551+
assertThat(iterator.hasNext()).isEqualTo(false);
552+
assertThrows(NoSuchElementException.class, iterator::next);
553+
collectedItems.add(iterator.previous());
554+
assertThat(iterator.hasPrevious()).isEqualTo(true);
555+
collectedItems.add(iterator.previous());
556+
assertThat(iterator.hasPrevious()).isEqualTo(true);
557+
collectedItems.add(iterator.previous());
558+
assertThat(iterator.hasPrevious()).isEqualTo(false);
559+
assertThrows(NoSuchElementException.class, iterator::previous);
560+
561+
assertThat(collectedItems).isEqualTo(List.of("Tikhon", "Nina", "Nina", "Tikhon", "Andrei"));
497562
}
498563

499564
@Test

0 commit comments

Comments
 (0)