在Java中实现Iterable remove()和iterator()

时间:2011-12-03 23:51:50

标签: java iterator

我正在尝试使用Java中的Iterable实现Iterator,这是我到目前为止所拥有的:

public class keysIterator<A> implements Iteratble<A<{
     A[] elements;
     int nextElement; 

keysIterator(A[] elements, int nextElement) {
    this.elements = elements;
    this.nextElement = 0;
}

public boolean hasNext() {
    return this.nextElement < elements.length;
}

public A next() {
    A result = elements[nextElement];
    nextElement = nextElement + 1;
    return result;
}

public void remove() {
    // TODO Auto-generated method stub   
}

public Iterator<A> iterator() {
    // TODO Auto-generated method stub
}

}

我需要帮助编写remove和iterator方法,任何帮助都非常有用。

谢谢。

3 个答案:

答案 0 :(得分:4)

拥有Iterator实现Iterable对我没有意义

Ithing Ithingrable有一个iterator()方法,它返回一个Iterator。

此外,迭代器通常不保存数据,但引用具有数据的其他实例。

通常

class Foo implements Iterable
{
    public Iterator iterator() {
        return new FooIterator();
    }
}

class FooIterator implements Iterator {
     // with methods as you've defined them
}

答案 1 :(得分:4)

您正在将Iterator接口的实现与Iterable类混合。试试这个:

public class KeysIterable<A> implements Iterable<A> {
    A[] elements;
    int nElements;

    private class KeysIterator<A> implements Iterator<A> {
        int nextElement = 0;

        public boolean hasNext() {
            return nextElement < nElements;
        }

        public A next() {
            A result = elements[nextElement];
            nextElement = nextElement + 1;
            return result;
        }

        public void remove() {
            if (nextElement < nElements - 1) {
                System.arraycopy(elements, nextElement + 1,
                    elements, nextElement, nElements - nextElement - 1);
            }
            nElements--;
        }
    }

    public Iterator<A> iterator() {
        return new KeysIterator<A>();
    }

    public KeysIterable() {

    }

    // other methods
}

使用ArrayList而不是通用数组实现Iterable类可能会更好。

答案 2 :(得分:2)

使用ArrayList代替数组,所以你可以这样做:

public Iterator<A> iterator() {
    return elements.iterator();
}

如果你真的想要一个数组,你总是可以这样做:

public Iterator<A> iterator() {
    return Arrays.asList(elements).iterator();
}