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

8

迭代器不能产生原始类型的值。但是,它可以产生包装类型的值Byte。这些值可以自动拆箱byte只要它们不是null)。

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

然后你可以像这样使用它:

for (byte b : example) { ... }
于 2013-04-03T15:13:24.640 回答
7

Java 8 引入了原始迭代器,允许您在对 int、long 和 double 集合进行迭代期间避免装箱/拆箱。

您可以通过类型安全地实现 generic来创建自己PrimitiveIterator的。也将实施。两者都非常简单。bytePrimitiveIterator<Byte,ByteConsumer>ByteConsumer

PrimitiveIterator.ofByte为什么jdk里面没有?可能是因为机器字长,通常不小于 int。或者字节迭代器最好由流等完成。

于 2015-06-28T16:18:08.493 回答
1

您不能将泛型与基元一起使用,因为泛型需要该类型的类。

您可以做的是遍历包装器类型(整数、字节、布尔值等)...

于 2013-04-03T15:15:03.953 回答
0

实现Iterable,并返回一个 Byte 对象而不是一个字节原语:

class Example implements Iterable<Byte> {

..

    public Iterator<Byte> iterator() {
        return new MyIterator();
    }

    private class MyIterator implements Iterator<Byte> {
        public Byte next() {...}
        ....
    }
}

实现 Iterable 而不是 Iterator 允许您使用 for-each 循环直接循环对象项。

于 2013-04-03T15:14:45.610 回答
0

如果你想让你的迭代器实现 java.util.Iterator 那么 next() 将不得不返回 Byte

class ByteArrayIterator implements Iterator<Byte> {
    final byte[] a; 
    int i = 0;
    ByteArrayIterator(byte[] a) {
        this.a = a; 
    }

    public boolean hasNext() {
        return i < a.length;
    }

    public Byte next() {
        if (i == a.length) {
            throw new NoSuchElementException();
        }
        return a[i++];
    }

    public void remove() {
        throw new UnsupportedOperationException();
    }
}

remove 也可以实现。如果您不需要它实现迭代器,那么我们可以更改 next() 以返回字节

    class ByteArrayIterator {
...
    public byte next() {
            if (i == a.length) {
                throw new NoSuchElementException();
            }
            return a[i++];
        }
于 2013-04-03T15:19:25.527 回答