Skip to content

Instantly share code, notes, and snippets.

@JeffMcKnight
Created May 31, 2019 06:13
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save JeffMcKnight/828c3eef1b81b446ad70867b5515642a to your computer and use it in GitHub Desktop.
Save JeffMcKnight/828c3eef1b81b446ad70867b5515642a to your computer and use it in GitHub Desktop.
Iterator backed by an array of integers which it interprets as a set of pairs, where the first item of the pair indicates how many values should be returned, and the second item of the pair indicates the value to be returned.
import java.util.Iterator;
import java.util.NoSuchElementException;
/**
* Iterator backed by an array of integers which it interprets as a set of pairs, where the
* first item of the pair indicates how many values should be returned, and the second
* item of the pair indicates the value to be returned. So, for example, when we iterate over the
* array <b>{3, 11, 0, 22, 2, 33}</b>, an ArrayIterator should return: <b><i>11, 11, 11, 33, 33</i></b>.
* <br>
* <br>
* We conceptualize the array as a linked list of nodes, each of which contains n integers of value x,
* where:
* <ul>
* <li>n = mArray[mIndex]</li>
* <li>x = mArray[mIndex + 1]</li>
* <li>mIndex = the ID of the node (where: ID % 2 == 0)</li>
* </ul>
*/
public class ArrayIterator implements Iterator<Integer> {
private int[] mArray;
private int mConsumed = 0;
private int mIndex = 0;
public ArrayIterator(int[] array) {
mArray = array;
}
@Override
public boolean hasNext() {
return hasNext(mIndex, mConsumed);
}
private boolean hasNext(int index, int consumed) {
if (!(index < mArray.length)) {
return false;
}
if (consumed < getNodeCapacity(index)) {
return true;
}
return hasNext(index + 2, 0);
}
@Override
public Integer next() {
if (!hasNext()) {
throw new NoSuchElementException();
}
if (mConsumed < getNodeCapacity(mIndex)) {
mConsumed++;
return getNodeValue(mIndex);
} else {
mIndex += 2;
mConsumed = 0;
return next();
}
}
private int getNodeCapacity(int index) {
return mArray[index];
}
private int getNodeValue(int index) {
return mArray[index + 1];
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment