J'ai besoin de savoir comment "réinitialiser" l'itérateur LinkedList sur son premier élément.
Par exemple:
LinkedList<String> list;
Iterator iter=list.listIterator;
iter.next();
iter.next();
Encore et encore et après de nombreux mouvements de l'itérateur, je dois "réinitialiser" la position de l'itérateur. `
Je veux demander comment je peux "réinitialiser" mon itérateur au premier élément
Je sais que je peux obtenir la liste itérateur du premier élément de cette manière:
iter= list.listIterator(1);
Est-ce la meilleure solution? ou peut-être ai-je raté quelque chose dans la documentation Oracle?
Le mieux serait de ne pas utiliser LinkedList
du tout, il est généralement plus lent dans toutes les disciplines et moins pratique. (Lors de l'insertion/suppression principalement à l'avant, en particulier pour les grands tableaux, LinkedList est plus rapide)
Utilisez ArrayList
, et parcourez avec
int len = list.size();
for (int i = 0; i < len; i++) {
Element ele = list.get(i);
}
La réinitialisation est triviale, il suffit de répéter la boucle.
Si vous insistez pour utiliser un itérateur, vous devez utiliser un nouvel itérateur:
iter = list.listIterator();
(Je n'ai vu qu'une seule fois dans ma vie un avantage de LinkedList: je pouvais effectuer une boucle avec une boucle while et supprimer le premier élément)
Vous pouvez appeler à nouveau la méthode listIterator
pour obtenir une instance d'itérateur pointant au début de la liste:
iter = list.listIterator();
C'est une solution alternative, mais on pourrait dire que cela n'ajoute pas assez de valeur pour que ça en vaille la peine:
import com.google.common.collect.Iterables;
...
Iterator<String> iter = Iterables.cycle(list).iterator();
if(iter.hasNext()) {
str = iter.next();
}
L'appel de hasNext () réinitialisera le curseur itérateur au début s'il s'agit de la fin.
Si l'ordre n'a pas d'importance, nous pouvons réitérer en arrière avec le même itérateur en utilisant les méthodes hasPrevious()
et previous()
:
ListIterator<T> lit = myList.listIterator(); // create just one iterator
Initialement, l'itérateur est assis au début, nous faisons l'itération forward:
while (lit.hasNext()) process(lit.next()); // begin -> end
Ensuite, l'itérateur s'assied à la fin, nous pouvons faire en arrière itération:
while (lit.hasPrevious()) process2(lit.previous()); // end -> begin
L'appel de iterator()
sur une collection implique probablement un nouvel itérateur à chaque appel.
Ainsi, vous pouvez simplement appeler à nouveau iterator()
pour en obtenir un nouveau.
IteratorLearn.Java
import org.testng.Assert;
import org.testng.annotations.Test;
import Java.util.Collection;
import Java.util.HashSet;
import Java.util.Iterator;
/**
* Iterator learn.
*
* @author eric
* @date 12/30/18 4:03 PM
*/
public class IteratorLearn {
@Test
public void test() {
Collection<Integer> c = new HashSet<>();
for (int i = 0; i < 10; i++) {
c.add(i);
}
Iterator it;
// iterate,
it = c.iterator();
System.out.println("\niterate:");
while (it.hasNext()) {
System.out.printf("\t%d\n", it.next());
}
Assert.assertFalse(it.hasNext());
// consume,
it = c.iterator();
System.out.println("\nconsume elements:");
it.forEachRemaining(ele -> System.out.printf("\t%d\n", ele));
Assert.assertFalse(it.hasNext());
}
}
Sortie:
iterate:
0
1
2
3
4
5
6
7
8
9
consume elements:
0
1
2
3
4
5
6
7
8
9