Подтвердить что ты не робот

Java- reset перечислить итератор в первый элемент списка

Мне нужно знать, как "reset" итератор LinkedList к его первому элементу.

Например:

LinkedList<String> list;

Iterator iter=list.listIterator;

iter.next();

iter.next();

Снова и снова и после многих ходов итератора мне нужно "reset" позицию итератора. `

Я хочу спросить, как я могу "reset" мой итератор для первого элемента

Я знаю, что я могу получить итератор списка первого элемента таким образом:

iter= list.listIterator(1);

Это лучшее решение? или, может быть, я что-то пропустил в документах Oracle?

4b9b3361

Ответ 1

Лучше всего не использовать LinkedList вообще, как правило, он медленнее во всех дисциплинах и менее удобен. (При основном вставке/удалении спереди, особенно для больших массивов LinkedList быстрее)

Используйте ArrayList и итерации с помощью

int len = list.size();
for (int i = 0; i < len; i++) {
  Element ele = list.get(i);
}

Reset является тривиальным, просто повторим цикл.
Если вы настаиваете на использовании итератора, вы должны использовать новый итератор:

iter = list.listIterator();

(я видел только один раз в жизни преимущество LinkedList: я мог бы прокручивать цикл while и удалять первый элемент)

Ответ 2

Вы можете снова вызвать метод listIterator, чтобы получить экземпляр итератора, указывающий на начало списка:

iter = list.listIterator();

Ответ 3

Это альтернативное решение, но можно утверждать, что оно не добавляет достаточного значения, чтобы оно того стоило:

import com.google.common.collect.Iterables;
...
Iterator<String> iter = Iterables.cycle(list).iterator();
if(iter.hasNext()) {
    str = iter.next();
}

Вызов hasNext() будет reset курсором итератора к началу, если это конец.

Ответ 4

Если порядок не имеет значения, мы можем повторить итерацию назад с тем же итератором с помощью методов hasPrevious() и previous():

ListIterator<T> lit = myList.listIterator(); // create just one iterator

Первоначально итератор сидит в начале, мы идем вперед:

while (lit.hasNext()) process(lit.next()); // begin -> end

Затем итератор сидит в конце, мы можем выполнить обратную итерацию:

while (lit.hasPrevious()) process2(lit.previous()); // end -> begin

Ответ 5

Вызовчивая iterator() для коллекции impl, вероятно, получит новый Iterator при каждом вызове.

Таким образом, вы можете просто вызвать iterator() снова, чтобы получить новый.


Код

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());
    }
}

Выход:

iterate:
    0
    1
    2
    3
    4
    5
    6
    7
    8
    9

consume elements:
    0
    1
    2
    3
    4
    5
    6
    7
    8
    9

Ответ 6

На самом деле вы можете захотеть использовать Iterable, который может возвращать новый Iterator несколько раз, вызывая iterator().

//A function that needs to iterate multiple times can be given one Iterable:
public void func(Iterable<Type> ible) {
    Iterator<Type> it = ible.iterator(); //Gets an iterator
    while (it.hasNext()) {
        it.next();
    }
    it = ible.iterator(); //Gets a NEW iterator, also from the beginning
    while (it.hasNext()) {
        it.next();
    }
}

Вы должны заранее определить, что метод iterator() делает только один раз:

void main() {
    LinkedList<String> list; //This could be any type of object that has an iterator
    //Define an Iterable that knows how to retrieve a fresh iterator
    Iterable<Type> ible = new Iterable<Type>() {
        @Override
        public Iterator<Type> iterator() {
            return list.listIterator(); //Define how to get a fresh iterator from any object
        }
    };
    //Now with a single instance of an Iterable,
    func(ible); //you can iterate through it multiple times.
}