I was looking back over at some code that I wrote where I'd needed to different iterators, and I noticed that I'd written the first iterator as normal, like this:
private class Traverse implements Iterator {
int pos = 0;
boolean hasNextCalled = false;
@Override
public boolean hasNext() {
hasNextCalled = true;
if(pos<size()) {
return true;
} else {
return false;
}
}
@Override
public Card next() {
return cards.get(pos++);
}
@Override
public void remove() {
if (!hasNextCalled) {
throw new IllegalStateException("hasNext() must be called before remove()");
}
if(pos<1) {
throw new IllegalStateException();
}
cards.remove(--pos);
hasNextCalled = false;
}
}
and then implemented the second iterator by creating a new Traverse object but then overriding all the methods:
public Iterator OddEvenIterator() {
Iterator it = new Traverse(){
private int pos = 0;
boolean hasNextCalled = false;
@Override
public boolean hasNext() {
hasNextCalled = true;
if (pos < size()) {
return true;
} else {
return false;
}
}
@Override
public Card next() {
Card nextCard = cards.get(pos);
pos+=2;
boolean moreCards = hasNext();
if(moreCards==false) {
pos=1;
}
return nextCard;
}
@Override
public void remove() {
if (!hasNextCalled) {
throw new IllegalStateException("hasNext() must be called before remove()");
}
if (pos < 1) {
throw new IllegalStateException();
}
pos-=2;
cards.remove(pos);
hasNextCalled = false;
}
};
return it;
}
I can't remember why I did this but it feels like a bad way to do it. I was wondering if there was any effective difference between these two methods?