Skip to content

Commit 0f3d0db

Browse files
committed
Adjust NestedIterator to support ignored test-case
Use updated RecursiveIterator solution for that
1 parent d428965 commit 0f3d0db

File tree

2 files changed

+37
-24
lines changed

2 files changed

+37
-24
lines changed

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

Lines changed: 33 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -42,43 +42,57 @@
4242
public class NestedIterator implements Iterator<Integer> {
4343

4444
private final Deque<Iterator<INestedInteger>> stack = new ArrayDeque<>();
45+
private Integer nextElement;
4546

4647
public NestedIterator(List<INestedInteger> nestedList) {
4748
stack.push(nestedList.iterator());
4849
}
4950

5051
@Override
5152
public Integer next() {
52-
if (stack.isEmpty()) {
53+
var result = determineNextElement();
54+
if (result == null) {
5355
throw new NoSuchElementException();
5456
}
57+
return result;
58+
}
5559

56-
var currentIterator = stack.peek();
57-
if (!currentIterator.hasNext()) {
58-
stack.pop();
59-
return next();
60+
@Override
61+
public boolean hasNext() {
62+
if (nextElement != null) {
63+
return true;
6064
}
65+
nextElement = determineNextElement();
66+
return nextElement != null;
67+
}
6168

62-
INestedInteger object = currentIterator.next();
63-
if (object.isInteger()) {
64-
return object.getInteger();
69+
private Integer determineNextElement() {
70+
if (nextElement != null) {
71+
var result = nextElement;
72+
nextElement = null;
73+
return result;
6574
}
66-
stack.push(object.getList().iterator());
67-
return next();
68-
}
6975

70-
@Override
71-
public boolean hasNext() {
7276
if (stack.isEmpty()) {
73-
return false;
77+
return null;
7478
}
7579

76-
var currentIterator = stack.peek();
77-
if (currentIterator.hasNext()) {
78-
return true;
80+
while (!stack.isEmpty()) {
81+
Iterator<INestedInteger> iterator = stack.peek();
82+
if (iterator.hasNext()) {
83+
var next = iterator.next();
84+
85+
if (!next.isInteger()) {
86+
stack.push(next.getList().iterator());
87+
return determineNextElement();
88+
} else {
89+
return next.getInteger();
90+
}
91+
} else {
92+
stack.pop();
93+
}
7994
}
80-
stack.pop();
81-
return hasNext();
95+
return null;
8296
}
8397

8498
public interface INestedInteger {

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

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,10 @@ public void testNextAndHasNext() {
2525
),
2626
List.of(1, 4, 6));
2727

28-
// TODO: fix implementation to support this case
29-
// check(List.of(
30-
// new NestedIntegerList()
31-
// ),
32-
// List.of());
28+
check(List.of(
29+
new NestedIntegerList()
30+
),
31+
List.of());
3332
}
3433

3534
private void check(List<INestedInteger> incoming, List<Integer> outgoing) {

0 commit comments

Comments
 (0)