Java - 如何在迭代期间引用上一个和下一个元素?

时间:2011-12-19 17:31:01

标签: java loops foreach

当我有 for loop 时,我使用i来引用我的数组,对象等元素。

像:
当前项目:myArray[i]
下一项:myArray[i+1]
上一项:myArray[i-1]

但此刻,我正在使用 foreach 循环(for (Object elem : col) {)。
我如何参考上一个项目?
(我需要搜索一个'数组',我正在使用for (Object object : getComponents())

但是当它返回true时(因此它找到我要查找的内容),它应该在上一个 next 项上执行代码。

澄清:我有java.awt.Component个元素!

5 个答案:

答案 0 :(得分:9)

如果数据结构是List,那么您可以直接使用ListIterator。 ListIterator很特殊,因为它包含方法next()previous()

List list = ...;
ListIterator iter = list.listIterator(); //--only objects of type List has this
while(iter.hasNext()){
    next = iter.next();
    if (iter.hasPrevious()) //--note the usage of hasPrevious() method
       prev = iter.previous(); //--note the usage of previous() method
}

答案 1 :(得分:5)

foreach循环不会让你这样做。我的建议是回到使用古老的Iterator。例如

final Iterator itr=getComponents().iterator();
Object previous=itr.next();
Object current=itr.next();
while(itr.hasNext()){
    Object next=itr.next();
    //Do something with previous, current, and next.
    previous=current;
    current=next;
}

答案 2 :(得分:1)

JButton prev, next, curr;
Component[] arr = getComponents();

for(int i=1;i<arr.length-1;i++) {
    if (yourcondition == true) {
        curr = (JButton) arr[i];
        prev = (JButton) arr[i-1];
        next = (JButton) arr[i+1];
    }
}

答案 3 :(得分:0)

数组索引

如果您有类似数组的数据结构(例如实际数组或类似ArrayList的内容),则引用ii-1i+1会提供良好的表现,因此它没有更多。 (虽然必须将For-Each循环变成一个计算For Loop的索引并不是很有趣,但却是为数不多的警告之一。)

谢尔盖提供的答案就是这样的。

多才多艺的ListIterator

如果你可以接受ListIterator(这实际上是一个很大的假设),那么Suraj提供的答案就足够了。但请注意next()previous() 移动迭代器位置。因此,如果您为每个循环迭代执行类似以下操作:prev = previous(); current = next(); next = next(); previous(),您最终将在每个循环中执行大约4次迭代操作。如果迭代很便宜,这不是一个很大的问题,幸运的是,这通常是提供ListIterator的数据结构的情况。

通用解决方案

任何Iterable(或Iterator)的通用解决方案都不应进行随机查找(对于数组可能)或对next()的性能做出假设,应该调用最多N次,其中N是可用元素的数量。

这是一个这样的实现:

final Iterator<E> it = iterable.iterator();

for (E next = (it.hasNext() ? it.next() : null), current = null; next != null;) {
    E previous = current;
    current = next;
    next = it.hasNext() ? it.next() : null;

    // Do something using 'current', 'previous' and 'next'.
    // NB: 'previous' and/or 'next' are null when 'current' is
    // the first and/or last element respectively
}

介意,这个实现有自己的注意事项:

  • 如果Iterable包含null元素,则会中断。
  • currentnext都不是有效最终,因此无法直接在其中使用Java 8 lambdas。

答案 4 :(得分:0)

我这样做是为了在使用增强的 for 循环时访问列表中的上一个和下一个元素。

这是一个简短的片段:

import java.util.ArrayList;
import java.util.List;

class Scratch {

  public static void main(String[] args) {
    List<Integer> myInts = new ArrayList<>();
    myInts.add(1);
    myInts.add(2);
    myInts.add(3);
    myInts.add(4);
    myInts.add(5);

    Integer next = null;
    Integer previous = null;

    for (Integer current: myInts) {
        try {
                previous = myInts.get(myInts.indexOf(current)-1);
            } catch (IndexOutOfBoundsException ignored){
               // ignored
            }
        try {
                next = myInts.get(myInts.indexOf(current)+1);
            } catch (IndexOutOfBoundsException ignored){
                next = null;
            }
        System.out.println("previous = " + previous);
        System.out.println("current = " + current);
        System.out.println("next = " + next);
    }
  }
}

输出:

previous = null
current = 1
next = 2
previous = 1
current = 2
next = 3
previous = 2
current = 3
next = 4
previous = 3
current = 4
next = 5
previous = 4
current = 5
next = null

是的!我知道,代码很丑。但是,它完成了工作。