Nic*_*ner 1 java iterator dry software-design inner-classes
我使用内心有困难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();
}
}
Run Code Online (Sandbox Code Playgroud)
然后,我尝试迭代它:
for (String s : wordIterator) { //Error: Can only iterate over an array or an instance of java.lang.Iterable
words.add(s);
Run Code Online (Sandbox Code Playgroud)
但它不起作用.(请参阅有问题的行上的注释编译器错误).我在这做错了什么?
在工程说明中,做是解决问题的正确方法吗?我有一堆这种形式的循环:
for (List<? extends HasWord> sent : sentences) {
for (HasWord token : sent) {
//do stuff
}
}
Run Code Online (Sandbox Code Playgroud)
所以我决定一个Iterator会更清洁.这有点矫枉过正,还是有另外一种方法可以做到这一点?
有两个嵌套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
}
Run Code Online (Sandbox Code Playgroud)
每次需要多个句子的迭代器时,返回此类的新实例,并sentences使用初始化字段sentences.iterator();
(在仔细阅读您的问题后编辑)
| 归档时间: |
|
| 查看次数: |
4723 次 |
| 最近记录: |