当我有 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
个元素!
答案 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
的内容),则引用i
,i-1
, i+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
元素,则会中断。current
或next
都不是有效最终,因此无法直接在其中使用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
是的!我知道,代码很丑。但是,它完成了工作。