使用Java中的Iterator从循环中的集合中获取当前和下一个元素

时间:2017-09-21 13:22:43

标签: java collections iterator next

我有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
}

2 个答案:

答案 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。似乎很好地匹配您当前的结构。