Java-как я могу ссылаться на предыдущий и следующий элемент во время итерации?
когда у меня есть цикл, Я использую i
для ссылки на элементы моего массива, объекты и т. д.
как:
Текущий пункт:myArray[i]
Следующий пункт:myArray[i+1]
Предыдущий пункт:myArray[i-1]
но на данный момент я использую foreach петля ( for (Object elem : col) {
).
Как я могу сослаться на предыдущий пункт?
(Мне нужно выполнить поиск "массива", который я делаю с for (Object object : getComponents())
.
но когда он возвращает true (так что он находит то, что я ищу), он должен выполнить код на и далее товар.
пояснение: я java.awt.Component
элементы!
4 ответов
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];
}
}
если структура данных является списком, то вы можете использовать ListIterator напрямую. ListIterator является специальным, потому что он содержит оба метода next()
и предыдущей()
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
}
на foreach
loop не позволит вам это сделать. Мое предложение-вернуться к старой доброй 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;
}
индексирование массива
если у вас есть массив-как структура данных (например, массива или что-то вроде ArrayList
), то ссылка i
, i-1
, i+1
даст хорошее представление не больше. (Хотя необходимость превратить цикл For-Each в индекс подсчета для цикла не очень весело и является одним из немногих предостережений.)
ответ, предложенный Сергеем, делает что-то вроде этого.
универсальный ListIterator
если вы можете получить ваши руки на ListIterator
(что на самом деле довольно большое предположение), ответ, предложенный Сураджем, может быть достаточным. Но обратите внимание на оба next()
и previous()
перемещение позиции итератора. Так что если вы сделали что-то вроде следующего для каждой итерации цикла: prev = previous(); current = next(); next = next(); previous()
, вы закончите выполнение примерно 4 итерационных операций за цикл. Это не большая проблема, если итерации дешево, и к счастью, это часто бывает для data-структуры, которые предлагают 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
are эффективно-заключительный, поэтому нельзя использовать непосредственно в них fangled Java 8 lambdas.