Java- reset перечислить итератор в первый элемент списка
Мне нужно знать, как "reset" итератор LinkedList к его первому элементу.
Например:
LinkedList<String> list;
Iterator iter=list.listIterator;
iter.next();
iter.next();
Снова и снова и после многих ходов итератора мне нужно "reset" позицию итератора.
`
Я хочу спросить, как я могу "reset" мой итератор для первого элемента
Я знаю, что я могу получить итератор списка первого элемента таким образом:
iter= list.listIterator(1);
Это лучшее решение? или, может быть, я что-то пропустил в документах Oracle?
Ответы
Ответ 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.
}