Skip to content

Commit d428965

Browse files
committed
Rewrite RecursiveIterator solution to add support of disabled test
1 parent e975cab commit d428965

File tree

2 files changed

+32
-19
lines changed

2 files changed

+32
-19
lines changed

src/main/java/by/andd3dfx/iterators/RecursiveIterator.java

Lines changed: 32 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -18,42 +18,56 @@
1818
public class RecursiveIterator<Object> implements Iterator<Object> {
1919

2020
private final Deque<Iterator<Object>> stack = new ArrayDeque<>();
21+
private Object nextElement;
2122

2223
public RecursiveIterator(Iterator<Object> iterator) {
2324
stack.push(iterator);
2425
}
2526

2627
@Override
2728
public boolean hasNext() {
28-
if (stack.isEmpty()) {
29-
return false;
30-
}
31-
32-
Iterator<Object> currentIterator = stack.peek();
33-
if (currentIterator.hasNext()) {
29+
if (nextElement != null) {
3430
return true;
3531
}
36-
stack.pop();
37-
return hasNext();
32+
nextElement = determineNextElement();
33+
return nextElement != null;
3834
}
3935

4036
@Override
4137
public Object next() {
42-
if (stack.isEmpty()) {
38+
var result = determineNextElement();
39+
if (result == null) {
4340
throw new NoSuchElementException();
4441
}
42+
return result;
43+
}
4544

46-
Iterator<Object> currentIterator = stack.peek();
47-
if (!currentIterator.hasNext()) {
48-
stack.pop();
49-
return next();
45+
private Object determineNextElement() {
46+
if (nextElement != null) {
47+
var result = nextElement;
48+
nextElement = null;
49+
return result;
5050
}
5151

52-
Object object = currentIterator.next();
53-
if (object instanceof String) {
54-
return object;
52+
if (stack.isEmpty()) {
53+
return null;
54+
}
55+
56+
while (!stack.isEmpty()) {
57+
Iterator<Object> iterator = stack.peek();
58+
if (iterator.hasNext()) {
59+
var next = iterator.next();
60+
61+
if (next instanceof Iterator) {
62+
stack.push((Iterator<Object>) next);
63+
return determineNextElement();
64+
} else {
65+
return next;
66+
}
67+
} else {
68+
stack.pop();
69+
}
5570
}
56-
stack.push((Iterator<Object>) object);
57-
return next();
71+
return null;
5872
}
5973
}

src/test/java/by/andd3dfx/iterators/RecursiveIteratorTest.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@ public void testNextHasNextForComplexStructure() {
4242
assertThat(result).isEqualTo(List.of("1", "3", "9", "4", "23", "31", "88", "22", "5", "37", "11"));
4343
}
4444

45-
@Ignore("TODO: change implemetation to support this case")
4645
@Test
4746
public void testNextForListOfEmptyLists() {
4847
List<Object> list = Arrays.asList(List.of().iterator(), List.of(List.of().iterator()).iterator());

0 commit comments

Comments
 (0)