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)
Je l'enregistre en tant qu'attribut dans une connexion Red5, puis le recharge pour continuer à travailler là où je me suis arrêté.
Je parcours le clavier de HashMap
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;
}
Vous pouvez utiliser ListIterator
au lieu de Iterator
. ListIterator a les méthodes previous()
et hasPrevious()
.
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.
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.
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.)
En fin de compte, les Iterator
s 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
.
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.
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
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 ().
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);
}
}