1

インナー使いに困っていIteratorます。

private List<List<? extends HasWord>> sentences = new ArrayList<List<? extends HasWord>>(); 
private Iterator<String> wordIterator = new Words();
private class Words implements Iterator<String> {

    int currSentence = 0;
    int currWord = 0;

    @Override
    public boolean hasNext() {
        return currSentence != sentences.size() - 1 && currWord != sentences.get(currSentence).size() - 1;
    }

    @Override
    public String next() {
        String nextWord = sentences.get(currSentence).get(currWord).word();
        currSentence++;
        currWord++;

        return nextWord;
    }

    @Override
    public void remove() {
        throw new UnsupportedOperationException();          
    }

}

次に、それを反復しようとします。

for (String s : wordIterator) { //Error: Can only iterate over an array or an instance of java.lang.Iterable
            words.add(s);

しかし、うまくいきません。(問題のある行のコメント付きコンパイラ エラーを参照してください)。ここで何が間違っていますか?

エンジニアリングの観点から、私の問題を解決する正しい方法はありますか? この形式のループがたくさんあります。

    for (List<? extends HasWord> sent : sentences) {
        for (HasWord token : sent) {
            //do stuff
        }
        }

だから私はIteratorよりきれいになると決めました。これはやり過ぎですか、それとも別の方法がありますか?

4

2 に答える 2

5

これを行うために2 つのネストされたforループを使用しても根本的に問題はありませんが、これはよりクリーンになると思います。

public class Words implements Iterator<String> {
  private final Iterator<HasWord> sentences;
  private Iterator<String> currentSentence;

  public boolean hasNext() {
    return currentSentence.hasNext() || sentences.hasNext();
  }

  public String next() {
    if (currentSentence.hasNext()) {
      return currentSentence.next();
    }
    currentSentence = sentences.next();
    return next(); // will return the first word of the next sentence
  }
  //remove() omitted for brevity
}

複数の文にわたって反復子が必要になるたびに、このクラスの新しいインスタンスを返し、次sentencesを使用してフィールドを初期化します。sentences.iterator();

(あなたの質問をより注意深く読んだ後に編集されました)

于 2009-12-08T18:48:07.363 に答える
3
private class Words implements Iterator<String>, Iterable<String> {
  ...
  public Iterator<String> iterator() {
    return this;
  }
  ...
}
于 2009-12-08T20:51:18.377 に答える