【问题标题】:Java Inner Class Iterator ProblemJava内部类迭代器问题
【发布时间】:2009-12-08 18:45:25
【问题描述】:

我在使用内部 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 会更干净。这是矫枉过正,还是有其他方法可以做到?

【问题讨论】:

    标签: java iterator dry software-design inner-classes


    【解决方案1】:

    使用两个嵌套的 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.iterator();初始化sentences字段

    (在仔细阅读您的问题后编辑)

    【讨论】:

    • 请注意,如果句子可以为空,您可能需要添加一些额外的检查。
    【解决方案2】:
    private class Words implements Iterator<String>, Iterable<String> {
      ...
      public Iterator<String> iterator() {
        return this;
      }
      ...
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-15
      • 2016-06-15
      • 1970-01-01
      • 2012-03-03
      • 2011-09-16
      • 1970-01-01
      • 1970-01-01
      • 2012-12-14
      相关资源
      最近更新 更多