2012-03-23 71 views
1

接受一個java類,我們必須設計我們自己的HashSet類。 (不使用JAVA API)Java:爲用戶創建的HashSet類實現迭代器。 next()和hasNext()的語義?

我必須爲此實現和迭代器,並且我對使用它的語義感到困惑。

不確定是否應該允許調用Next()來調用迭代器的索引,或者如果用戶必須將next()與絕對路徑一起使用next()循環,指數。

例如,如果用戶連續幾次調用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

的Javadoc規定,如果next被調用,不存在下一個元素,則必須拋出一個NoSuchElementException。也就是說,你不應該假設hasNext總是在next之前被調用 - 或hasNext只被調用一次!

爲哈希表做到這一點的典型方法是

  1. hasNext進步通過哈希表如果它尚未指向有效的元素。
  2. next作爲第一步調用hasNext,並在完成返回下一個元素之後,遞增到哈希表中的下一個位置(不檢查是否在該位置存在元素)。
+0

嗨路易斯,感謝您的澄清。你認爲你可以用一小段代碼指向正確的方向嗎?謝謝 – Wangagat 2012-03-23 21:22:53

+0

當然:Java'HashMap'源碼。 http://www.docjar.com/html/api/java/util/HashMap.java.html#791 – 2012-03-23 21:33:20

+0

好的,我根據您發送的鏈接對其進行了修改,但仍然無效(更新超過)@ Andrzej Doyle – Wangagat 2012-03-25 00:44:34

0

你絕對應該只能通過調用next()來使用迭代器,假設它處於有效狀態。每次迭代檢查hasNext()是做事情的慣用方式,但這不是必需的,您不應該依賴調用者這樣做。

事實上,hasNext()應該是冪等的,本質上不應該改變你的迭代器的任何狀態。由於它不改變國家,根據定義,它不能改變它以前是否被調用過。所以基本上是 - 每次調用next()時,都應該返回迭代器的「current」元素,然後向前推進「指針」(無論這些概念在實現中的含義如何)。

如果用戶連續幾次調用next()而不使用hasNext(),會發生什麼?

如果剩下足夠的元素進行迭代,他會在每次調用next()時返回連續的元素。如果他認爲他知道得更好,並且在到達迭代器結束時調用next()(即,當hasNext()將返回錯誤),則根據Javadocs,應該拋出NoSuchElementException