2012-03-23 4 views
1

はJavaクラスを採用しており、独自のHashSetクラスを設計する必要があります。 (JAVA APIを使用していません)Java:ユーザが作成したHashSetクラスのイテレータを実装しています。 next()とhasNext()のセマンティクス?

私はこのためにイテレータを実装しなければなりません。

イテレータのインデックスを移動するNext()呼び出しを許可する必要があるかどうか、またはnext()をhasNext()ループと共に使用して絶対にnextインデックス。

たとえば、ユーザーが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); 
    } 

答えて

3

Javadocはnextが呼び出され、次の要素がない場合は、あなたがNoSuchElementExceptionをスローしなければならないことを指定します。つまり、あなたははが常にnextの前に呼び出されると仮定するか、またはhasNextが1回だけ呼び出されると仮定してください。

ハッシュテーブルのためにこれを行うための典型的な方法は、ハッシュテーブル

  1. hasNext進歩が場合、それはすでに有効な要素を指していないということです。
  2. next最初のステップとしてhasNextが呼び出され、次の要素が返された後、ハッシュテーブル内の次の位置にインクリメントします(その位置に要素があるかどうかを確認せずに)。
+0

こんにちはルイ、説明のおかげで。コードスニペットで正しい方向に私を向けることができると思いますか?ありがとう – Wangagat

+0

確か:Javaの 'HashMap'ソース。 http://www.docjar.com/html/api/java/util/HashMap.java.html#791 –

+0

あなたが送信したリンクに基づいて変更しましたが、それでも動作しません(上記のアップデート) Andrzej Doyle – Wangagat

0

next()を呼び出すだけでイテレータを使用することができます。有効な状態であることを前提としています。各反復でhasNext()を確認することは、慣用的なやり方ですが、必須ではないため、これを行う発信者に頼るべきではありません。

実際、hasNext()は冪等でなければならず、基本的にイテレータの状態を変更しないでください。それは状態を変えるものではないので、以前に呼ばれたかどうかは、定義によってそれを変えることはできません。

基本的には、next()が呼び出されるたびに、イテレータの「現在の」要素を返してから、「ポインタ」を前進させる必要があります。

ユーザがhasNext()を使わずにnext()をいくつか連続して呼び出した場合はどうなりますか?

反復処理に十分な要素が残っていた場合は、を呼び出すたびに連続した要素が返されます。彼がよく知っていると思って、イテレータの最後に達した後にnext()を呼び出した場合(hasNext()がfalseを返した場合)、JavadocsにはNoSuchElementExceptionを投げるべきです。

関連する問題