patternjavaMinor
Iterator pattern/iterator class
Viewed 0 times
classiteratorpattern
Problem
I have implemented a simple iterator. Just want to check if I have missed anything.
Questions:
I assume apart from the above, I would have to implement a traversal algorithm and try to find if the next "traversal" successor exist?
interface iterator
{
boolean hasNext();
E next();
}
class Iterator implements iterator
{
E[] arr;
int curPos = 0;
@Override
public boolean hasNext()
{
if (curPos >= arr.length || arr[curPos] == null)
{
return false;
}
else
{
return true;
}
}
@Override
public E next()
{
if(hasNext())
{
E res = arr[curPos];
curPos++;
return arr[curPos+1];
}
else
{
throw new runtimeException("No next element available !");
}
}
}Questions:
- Why should I not use
Objectinstead ofE/template everywhere ?
- How do I make an iterator for a binary tree.
I assume apart from the above, I would have to implement a traversal algorithm and try to find if the next "traversal" successor exist?
Solution
I would write an iterator for arrays that way:
To your second question: I assume you want to traverse the tree in-order, and that the nodes have no link to the parent, only to the children. Then you need a node list from the root node to the current node, which can store if a node was already visited or not, too.
Then you go left as deep as possible, storing the path in the node list. This is your first current node. When you need the next one, take its parent (from the node list). Next would be the right children of that node (if there are any) or its own parent. The best way to understand this is to take a sheet of paper, draw different trees, and look how the traversal must work.
import java.util.Iterator;
import java.util.NoSuchElementException;
public class ArrayIterator implements Iterator {
private final E[] arr;
private int currentIndex = 0;
public ArrayIterator(E... arr) {
if(arr == null) {
throw new IllegalArgumentException("Array is null");
}
this.arr = arr;
}
public boolean hasNext() {
return currentIndex < arr.length;
}
public E next() {
if (! hasNext()) {
throw new NoSuchElementException();
}
return arr[currentIndex++];
}
public void remove() {
throw new UnsupportedOperationException("Not supported.");
}
}To your second question: I assume you want to traverse the tree in-order, and that the nodes have no link to the parent, only to the children. Then you need a node list from the root node to the current node, which can store if a node was already visited or not, too.
Then you go left as deep as possible, storing the path in the node list. This is your first current node. When you need the next one, take its parent (from the node list). Next would be the right children of that node (if there are any) or its own parent. The best way to understand this is to take a sheet of paper, draw different trees, and look how the traversal must work.
Code Snippets
import java.util.Iterator;
import java.util.NoSuchElementException;
public class ArrayIterator<E> implements Iterator<E> {
private final E[] arr;
private int currentIndex = 0;
public ArrayIterator(E... arr) {
if(arr == null) {
throw new IllegalArgumentException("Array is null");
}
this.arr = arr;
}
public boolean hasNext() {
return currentIndex < arr.length;
}
public E next() {
if (! hasNext()) {
throw new NoSuchElementException();
}
return arr[currentIndex++];
}
public void remove() {
throw new UnsupportedOperationException("Not supported.");
}
}Context
StackExchange Code Review Q#2811, answer score: 3
Revisions (0)
No revisions yet.