Iterator имеет .next() - есть ли способ получить предыдущий элемент вместо следующего?
У меня есть Итератор, который я использую в HashMap, и я сохраняю и загружаю итератор.
есть ли способ получить предыдущий ключ в HashMap с помощью Iterator? (Java.util.Iterator)
Update
Я сохраняю его как атрибут в соединении Red5, а затем загружаю его, чтобы продолжить работу там, где я остановился.
Другое обновление
Я выполняю итерацию через набор ключей HashMap
Ответы
Ответ 1
Не так, как указывали другие, но если вы, например, необходимо получить доступ к одному предыдущему элементу, который вы можете легко сохранить в отдельной переменной.
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;
}
Ответ 2
Вы можете использовать ListIterator
вместо Iterator
.
ListIterator имеет методы previous()
и hasPrevious()
.
Ответ 3
Похоже, вам нужна семантика массива, более близкая к ListIterator, а не те, которые предоставляются интерфейсом Iterator. Самый простой способ получить такую вещь, скорее всего, будет создавать список (из набора ключей (LinkedList<K> keyList = new LinkedList<K>(map.keySet())
), а затем использовать ListIterator вручную вместо обычного Iterator или foreach.
Для очень простых случаев необходимости запоминания последовательных элементов, самый простой способ справиться с этим - сохранить предыдущий ключ в локальной переменной и обновить его в конце цикла.
Ответ 4
Нет, Iterator<E>
определяет только 3 метода:
boolean hasNext()
E next()
void remove()
Вы можете, конечно, реализовать свой собственный итератор.
Ответ 5
Как говорили другие, вы получаете доступ только к элементу с помощью next()
. Однако это вопрос терминологии. Когда вы вызываете next()
, это текущий элемент.
Если проблема не в том, что вам нужно увидеть два последовательных элемента в коллекции, каждая итерация, и в этом случае простая переменная выглядит проще всего.
Ответ 6
Хотя Set
не предоставляет метод обратного итератора, Deque
. Вы можете использовать descendingIterator()
для итератора в обратном порядке и iterator()
, для итератора в порядке вперед.
(Вы можете создать Deque
из Set
через Deque<T> deque = new LinkedList<T>(set)
, где Set
- ваш Set
и T
тип общего типа, который вы используете.)
Ответ 7
В конечном счете Iterator
не полностью подходят для вашей задачи.
Почему бы не создать List
из Set
(через, например, List list = new LinkedList(set)
) и выполнить итерацию с помощью стандартного индексированного цикла for? Таким образом, вы знаете, что предыдущий элемент находится в i - 1
.
Ответ 8
с использованием итератора. Нет, у вас нет возможности получить предыдущее значение ключа. он имеет только методы hasNext() и next().
Ответ 9
Нет, вы не можете. Интерфейс Iterator не имеет способа получить предыдущий элемент.
Но то, что вы можете сделать, - немного мусорное создание List<Entry<Integer, YourObjectType>>
, где Integer
-value представляет хэш-код ключевого объекта. Затем вы можете сделать что-то вроде этого:
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
}
Я знаю, что это очень мусор, но возможно
Ответ 10
Создайте свой собственный итератор:
public class EnhancedIterator<E> implements Iterator<E>{
private List<E> list;
private int indexSelected=-1;
public EnhancedIterator(List<E> list){
this.list=list;
}
@Override
public boolean hasNext() {
return indexSelected<list.size()-1;
}
@Override
public E next() {
indexSelected++;
return current();
}
@Override
public void remove() {
list.remove(indexSelected);
}
public void remove(int i){
list.remove(i);
if(i<indexSelected){
indexSelected--;
}
}
public E previous(){
indexSelected--;
return current();
}
public E current(){
return list.get(indexSelected);
}
public E get(int i){
return list.get(i);
}
}