46

我需要知道如何将 LinkedList 迭代器“重置”为其第一个元素。

例如:

LinkedList<String> list;

Iterator iter=list.listIterator;

iter.next();

iter.next();

一遍又一遍,在迭代器的多次移动之后,我需要“重置”迭代器的位置。`

我想问我如何将我的迭代器“重置”到第一个元素

我知道我可以通过这种方式获取第一个元素的列表迭代器:

iter= list.listIterator(1);

这是最好的解决方案吗?或者我错过了 Oracle 文档中的某些内容?

4

7 回答 7

54

您可以再次调用listIterator方法以获取指向列表开头的迭代器实例:

iter = list.listIterator();
于 2012-12-03T18:20:52.000 回答
24

最好根本不使用LinkedList,通常它在所有学科中都比较慢,而且不太方便。(主要在前面插入/删除时,尤其是大数组LinkedList更快)

使用ArrayList, 并迭代

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

重置是微不足道的,只需再次循环。
如果您坚持使用迭代器,那么您必须使用新的迭代器:

iter = list.listIterator();

(我一生中只看到过一次 LinkedList 的优势:我可以通过 while 循环循环并删除第一个元素)

于 2012-12-03T18:23:44.393 回答
12

这是一种替代解决方案,但有人可能会争辩说它没有增加足够的价值使其值得:

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

如果它是结尾,则调用 hasNext() 会将迭代器光标重置到开头。

于 2015-02-28T02:46:26.330 回答
5

如果顺序无关紧要,我们可以使用and方法使用相同的迭代器重新向后迭代: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
于 2015-01-16T09:55:15.683 回答
4

您可能真正想要使用的是一个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.
}
于 2019-07-02T12:03:08.573 回答
1

调用iterator()Collection impl,可能会在每次调用时获得一个新的 Iterator。

因此,您只需iterator()再次调用即可获得新的。


代码

迭代器学习.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
于 2018-12-30T08:23:35.277 回答
0

您可以做的是,使用 while 循环手动将迭代器设置为第一个位置。

while(iter.hasPrevious())
{
    iter.previous();
}

当您退出循环时,您的迭代器将位于位置 0

对不起任何语法错误
于 2021-07-27T00:15:04.687 回答