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

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

Обновление

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

Еще одно обновление

Я перебираю набор ключей HashMap

Ответы [ 10 ]

28 голосов
/ 25 апреля 2012

Вы можете использовать ListIterator вместо Iterator. ListIterator имеет методы previous() и hasPrevious().

14 голосов
/ 05 мая 2010

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

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

14 голосов
/ 05 мая 2010

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

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;
}
3 голосов
/ 05 мая 2010

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

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

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

1 голос
/ 05 мая 2010

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

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

1 голос
/ 05 мая 2010

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

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

1 голос
/ 05 мая 2010

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

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

0 голосов
/ 12 июля 2016

Создайте свой собственный итератор:

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);
    }
}
0 голосов
/ 05 мая 2010

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

Но то, что вы можете сделать - это немного мусора - создать List<Entry<Integer, YourObjectType>>, где 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 голосов
/ 05 мая 2010

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

...