web-dev-qa-db-fra.com

Iterator has .next () - existe-t-il un moyen d’obtenir l’élément précédent au lieu du suivant?

J'ai un itérateur que j'utilise sur un HashMap, et je sauvegarde et charge l'itérateur. Existe-t-il un moyen d'obtenir la clé précédente dans HashMap avec Iterator? (Java.util.Iterator)

Mettre à jour

Je l'enregistre en tant qu'attribut dans une connexion Red5, puis le recharge pour continuer à travailler là où je me suis arrêté.

Une autre mise à jour

Je parcours le clavier de HashMap

15
ufk

Pas directement, comme d'autres l'ont fait remarquer, mais si vous par exemple Si vous devez accéder à un élément précédent, vous pouvez facilement l’enregistrer dans une variable distincte. 

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;
}
12
Jonik

Vous pouvez utiliser ListIterator au lieu de Iterator. ListIterator a les méthodes previous() et hasPrevious()

27
ak_

On dirait que vous voulez que la sémantique des tableaux ressemble plus à un ListIterator plutôt qu'à ceux fournis par l'interface Iterator. Le moyen le plus simple d’acquérir une telle chose est probablement de construire une liste (à partir de l’ensemble de clés (LinkedList<K> keyList = new LinkedList<K>(map.keySet()))), puis d’utiliser un ListIterator manuellement au lieu d’un Iterator ou d’une foreach ordinaire.

Pour les cas très simples de besoin de mémoriser des éléments consécutifs, le moyen le plus simple consiste à stocker la clé précédente dans une variable locale et à la mettre à jour à la fin de la boucle.

14
Ophidian

Non, un Iterator<E> définit seulement 3 méthodes:

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

Vous pouvez bien sûr implémenter votre propre itérateur.

3
Bart Kiers

Bien que Set ne fournisse pas de méthode pour un itérateur inversé, Deque est. Vous pouvez utiliser descendingIterator() pour un itérateur en ordre inverse et iterator() pour un itérateur en ordre avant.

(Vous pouvez créer une Deque à partir d'une Set via Deque<T> deque = new LinkedList<T>(set), où set est votre Set et T le type générique que vous utilisez.)

1
Humphrey Bogart

En fin de compte, les Iterators ne conviennent pas parfaitement à votre tâche.

Pourquoi ne pas créer une List à partir de votre Set (via, par exemple, List list = new LinkedList(set)) et effectuer une itération à l'aide d'un index standard for-loop? De cette façon, vous savez que l'élément précédent est à i - 1.

1
Humphrey Bogart

Comme d'autres l'ont déjà dit, vous accédez uniquement à un élément à l'aide de next(). Cependant, c'est en quelque sorte une question de terminologie. Une fois que vous appelez next(), ce est l’élément actuel.

À moins que le problème ne se pose, vous devez voir deux éléments consécutifs dans la collection à chaque itération. Dans ce cas, une variable simple semble plus simple.

1
Mr. Boy

Non, tu ne peux pas. L'interface Iterator n'a pas de méthode pour récupérer l'élément précédent.

Mais ce que vous pouvez faire, c’est créer un List<Entry<Integer, YourObjectType>> où la valeur Integer représente le code de hachage de l’objet clé. Ensuite, vous pouvez faire quelque chose comme ça:

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
}

Je sais que c'est très nul, mais c'est possible

0

en utilisant iterator, Non, vous n’avez pas d’option pour obtenir une valeur de clé précédente. il n'a que les méthodes hasNext () et next ().

0
GuruKulki

Fabriquez votre propre itérateur:

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
Daniel