web-dev-qa-db-fra.com

java- réinitialiser l'itérateur de liste au premier élément de la liste

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?

34
Krzysiek

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)

18
AlexWien

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();
41
anubhava

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.

8
tkane2000

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
4
ryenus

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.


Code

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
0
Eric Wang