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);
    }
}