我有Collection<T>
,名为&#34; col&#34;。包含类T的东西并不重要。当我迭代集合时,在每次迭代时我需要有当前元素和下一个元素。
Iterator it = col.iterator();
while (it.hasNext()) {
T line = (T) it.next();
T nextLine = it.hasNext()? NEXT_LINE : null;
// more Java code with line and nextLine
}
&#34; NEXT_LINE&#34;不是声明的常量,而是无效的代码。我需要用一个有效的Java代码替换它,它返回集合中的下一个元素,而不再增加迭代器。
我找到了这个链接: Java iterator get next without incrementing
在我的例子中,这个解决方案的弱点是,如果集合只包含1个元素,我必须在代码中做太多更改。如果我的版本有解决方案,则涵盖包含1个元素的案例,因为nextLine为null。
我也可以在ArrayList中转换集合,但只有当我认为没有更好的方法时我才会这样做:
ArrayList<T> list = new ArrayList<T>(col);
for (int i=0; i<list.size(); i++) {
T line = list.get(i);
T nextLine = i<list.size()-1 ? list.get(i+1) : null;
// more Java code with line and nextLine
}
答案 0 :(得分:2)
Iterator的用法如下(1 it.hasNext()
和1 it.next()
)。
Iterator<T> it = col.iterator();
T previous = null;
if (it.hasNext()) {
previous = it.next();
while (it.hasNext()) {
T next = it.next();
// ... previous ... next ..
previous = next;
}
}
答案 1 :(得分:2)
Guava包含PeekingIterator
接口,这可能是您的解决方案。
PeekingIterator it = Iterators.peekingIterator(col.iterator());
while (it.hasNext()) {
T line = (T) it.next();
T nextLine = it.hasNext()? it.peek() : null;
}
更多信息here。似乎很好地匹配您当前的结构。