9

次の形式の Java クラスがあります。

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;    }
}

次のように、イテレータを使用してプライベート データを外部から反復処理できるようにしたいと考えています。

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

プライベート Iterator クラスを実装しようとしましたが、問題が発生しました。

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
}

プリミティブ型 (ジェネリックではない) の外部反復子を実装するにはどうすればよいですか? これはJavaで可能ですか?

4

5 に答える 5

7

Java 8 ではプリミティブ iteratorsが導入されました。これにより、int、long、および double コレクションの反復中にボックス化/ボックス化解除を回避できます。

タイプセーフにジェネリックを実装することで、独自PrimitiveIteratorの を作成できます。も実施予定です。どちらも非常に簡単です。bytePrimitiveIterator<Byte,ByteConsumer>ByteConsumer

PrimitiveIterator.ofBytejdkにないのはなぜですか? おそらく機械語のサイズが原因で、通常は int より小さくありません。または、バイトイテレータは、ストリームなどで行う方が適切です。

于 2015-06-28T16:18:08.493 に答える