Java Iterator for primitive types

recursion.ninja picture recursion.ninja · Apr 3, 2013 · Viewed 7.6k times · Source

I have a Java class of the following form:

class Example {

  private byte[][] data;

  public Example(int s) { data = new byte[s][s]; }

  public byte getter(int x, int y)         { return byte[x][y]; }
  public void setter(int x, int y, byte z) { byte[x][y] = z;    }
}

I would like to be able to externally iterate over the private data using an iterator like so:

for(byte b : Example) { ;/* do stuff */ }

I tried to implement a private Iterator class but I ran into problems:

private class ExampleIterator implements Iterator {
  private int curr_x;
  private int curr_y;

  public ExampleIterator() { curr_x=0; curr_y=-1; }
  public boolean hasNext() { 
    return curr_x != field.length-1
        && curr_y != field.length-1; //is not the last cell?
  }
  public byte next() { // <-- Error is here: 
                       // Wants to change return type to Object
                       // Won't compile!
    if(curr_y=field.length) { ++curr_x; curr_y=0; }
    return field[curr_x][curr_y];
  }
  public void remove() { ; } //does nothing
}

How would I implement an external iterator for primitive types (not generics)? Is this possible in Java?

Answer

NPE picture NPE · Apr 3, 2013

An iterator cannot yield values of a primitive type. However, it could yield values of the wrapper type Byte. Such values can be auto-unboxed into byte (as long as they are not null).

private class ExampleIterator implements Iterator<Byte> {
  public boolean hasNext() { ... }
  public Byte next() { ... }
}

Then you can use it like so:

for (byte b : example) { ... }