【问题标题】:Java : Implementing iterator for user-created HashSet class. Semantics of next() and hasNext()?Java:为用户创建的 HashSet 类实现迭代器。 next() 和 hasNext() 的语义?
【发布时间】:2012-03-23 15:44:31
【问题描述】:

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

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

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

例如,如果用户在没有 hasNext() 的情况下连续多次调用 next() 会发生什么?

感谢大家的帮助!

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

【问题讨论】:

    标签: java iterator hashset


    【解决方案1】:

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

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

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

    【讨论】:

    • 嗨,路易斯,感谢您的澄清。你认为你可以用一段代码为我指出正确的方向吗?谢谢
    • 好的,我根据你发送的链接修改了它,但它仍然不起作用(上面更新)@Andrzej Doyle
    • 我看到的第一个问题是您没有将next 的初始位置移动到非空节点,HashMap 的迭代器在其构造函数中会这样做。
    • ...另外,我要指出,仅仅借用HashMap 代码批发并不是真正的重点。理解代码并从头开始重写才是真正的重点。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      您绝对应该能够通过仅调用next() 来使用迭代器,假设它处于有效状态以便您这样做。在每次迭代中检查 hasNext() 是惯用的做事方式,但这不是必需的,您不应该依赖调用者这样做。

      事实上,hasNext() 应该是幂等的,本质上不应该改变迭代器的任何状态。由于它不会改变状态,根据定义,无论它之前是否被调用过,它都不会改变。

      所以基本上是的 - 每次调用 next() 时,您都应该返回迭代器的“当前”元素,然后推进“指针”(无论这些概念在您的实现中意味着什么)。

      如果用户在没有 hasNext() 的情况下连续多次调用 next() 会发生什么?

      如果有足够的元素可以迭代,他会在每次调用next() 时返回连续的元素。如果他认为他知道得更好,并在到达迭代器末尾后调用next()(即当hasNext() 将返回false 时),那么根据Javadocs,您应该抛出NoSuchElementException

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-12-30
        • 2017-08-21
        • 1970-01-01
        • 2020-12-15
        • 2015-06-25
        • 1970-01-01
        • 2013-03-29
        相关资源
        最近更新 更多