Java:为用户创建的HashSet类实现迭代器。 next()和hasNext()的语义?

时间:2012-03-23 15:44:32

标签: java iterator hashset

获取java类,我们必须设计自己的HashSet类。 (不使用JAVA apis)

我必须为此实现和迭代,我对使用它的语义感到困惑。

不确定是否应该允许调用Next()来调用迭代器的索引,或者用户是否必须绝对使用next()和hasNext()循环来移动索引

例如,如果用户连续多次调用next()而没有hasNext(),会发生什么?

感谢大家的帮助!

public class HashWordSet implements WordSet {

private int size;
private Node[] buckets = new Node[8];
//above is only provided for mention of variables

    private class Node {
    Word value;
    Node next = null;

    public Node(Word word) {value = word;}
    public String toString() {return value.toString();}
}

class WordIterator implements Iterator<Word> {

    private Node next;
    private int index = 0;

    public Word next() {
        Node element = next;
        if (element == null)
            throw new NoSuchElementException();
        if ((next = element.next) == null) {
            Node[] temp = buckets;
            while (index < temp.length && (next = temp[index++]) == null)
                  ; 
        }
        return element.value;
    }

    public boolean hasNext() {
        return (next != null);
    }

3 个答案:

答案 0 :(得分:3)

Javadoc指定如果调用next并且没有下一个元素,则必须抛出NoSuchElementException。也就是说,你不应该假设在hasNext之前总是调用next - 或者只调用hasNext一次!

对哈希表执行此操作的典型方法是

  1. hasNext在哈希表中前进,如果它尚未指向有效元素。
  2. next调用hasNext作为其第一步,在完成返回下一个元素之后,递增到哈希表中的下一个位置(不检查该位置是否有元素) )。

答案 1 :(得分:1)

只需按照此处显示的API http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Iterator.html

即可

如果用户调用next()并且没有其他元素,则抛出NoSuchElementException。

答案 2 :(得分:0)

你绝对应该只能通过调用next()来使用迭代器,假设它处于有效状态,你可以这样做。在每次迭代中检查hasNext()是执行任务的惯用方法,但这不是必需的,您不应该依赖调用者这样做。

实际上,hasNext()应该是幂等的,基本上不应该改变迭代器的任何状态。由于它不会改变状态,因此根据定义,无论以前是否调用它都不会有所不同。

所以基本上是的 - 每次调用next()时,你应该返回迭代器的“当前”元素,然后推进“指针”(对于那些概念在你的实现中的意思)。

  

如果用户连续多次调用next()而没有hasNext()?

会发生什么情况

如果剩下足够的元素进行迭代,他会在每次调用next()时返回连续的元素。如果他认为他知道更好,并在到达迭代器结束后调用next()(即当hasNext()返回false时),那么根据Javadocs你应该抛出{{} 1}}。