Итератор имеет .next () - там способ получить предыдущий элемент вместо следующего?

У меня есть Итератор, который я использую на HashMap, и я сохраняю и загружаю итератор. существует ли способ получить предыдущий ключ в HashMap с Итератором? (java.util. Итератор)

Обновление

Я сохраняю его как атрибут в соединении Red5 и затем загружаю его назад, чтобы продолжить работать, где я остановился.

Другое обновление

Я выполняю итерации через набор ключей HashMap

18
задан Bill the Lizard 5 May 2010 в 12:27
поделиться

8 ответов

Не напрямую, как указывали другие, но если вы, например, необходимо получить доступ к одному предыдущему элементу, вы можете легко сохранить его в отдельной переменной.

T previous = null;
for (Iterator<T> i = map.keySet().iterator(); i.hasNext();) {
    T element = i.next();

    // Do something with "element" and "previous" (if not null)

    previous = element;
}
16
ответ дан 30 November 2019 в 05:51
поделиться

Хотя Set не предоставляет метод для обратного итератора, Deque предоставляет. Вы можете использовать DesndingIterator () для итератора в обратном порядке и iterator () для итератора в вперед порядке.

(Вы можете создать Deque из Set через Deque deque = new LinkedList (set) , где ) set - это ваш Set и T общий тип, который вы используете.)

1
ответ дан 30 November 2019 в 05:51
поделиться

Нет, не можете. Интерфейс Iterator не имеет способа получить предыдущий элемент.

Но что вы можете сделать, это - немного мусора - создать List > , где значение Integer представляет собой хэш-код ключевой объект. Тогда вы можете сделать что-то вроде этого:

for (int i = 0; i < list.size(); i++)
{
    YourObjectType current = list.get(i).getValue();
    YourObjectType previous = (i == 0 ? null : list.get(i - 1).getValue());
    // Do whatever you want
}

Я знаю, что это полная чушь, но это возможно

0
ответ дан 30 November 2019 в 05:51
поделиться

используя итератор, у вас нет возможности получить предыдущее значение ключа. у него есть только методы hasNext() и next().

0
ответ дан 30 November 2019 в 05:51
поделиться

В конечном итоге Итераторы не полностью подходят для вашей задачи.

Почему бы не создать список из вашего набора (например, с помощью List list = new LinkedList (set) ) и повторить его, используя стандартный индексированный для цикла? Таким образом, вы знаете, что предыдущий элемент находится в i - 1 .

1
ответ дан 30 November 2019 в 05:51
поделиться

Похоже, вы хотите, чтобы семантика массива была больше похожа на ListIterator , а не на ту, что предоставляется интерфейсом Iterator. Самый простой способ получить такую ​​вещь - это создать список (из набора ключей ( LinkedList keyList = new LinkedList (map.keySet ()) )), а затем использовать ListIterator вручную вместо обычного Iterator или foreach.

В очень простых случаях, когда необходимо запоминать последовательные элементы, самый простой способ справиться с этим - сохранить предыдущий ключ в локальной переменной и обновить его в конце цикла.

14
ответ дан 30 November 2019 в 05:51
поделиться

Нет, Iterator определяет только 3 метода:

boolean hasNext()
E next()
void remove() 

Вы, конечно, можете реализовать свой собственный итератор.

3
ответ дан 30 November 2019 в 05:51
поделиться

Как говорили другие, вы получаете доступ только к элементу с помощью next () . Однако это своего рода вопрос терминологии. Когда вы вызываете next () , этот становится текущим элементом.

Если проблема не в том, что вам нужно видеть два последовательных элемента в коллекции на каждой итерации, и в этом случае проще всего использовать простую переменную.

1
ответ дан 30 November 2019 в 05:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: