java-重置列表迭代器到列表的第一个元素

Krz*_*iek 35 java iterator

我需要知道如何将LinkedList迭代器"重置"到它的第一个元素.

例如:

LinkedList<String> list;

Iterator iter=list.listIterator;

iter.next();

iter.next();

一遍又一遍,经过迭代器的多次移动后,我需要"重置"迭代器的位置.`

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

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

iter= list.listIterator(1);

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

anu*_*ava 42

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

iter = list.listIterator();
Run Code Online (Sandbox Code Playgroud)

  • 真棒.并不是很明显,这个调用不只是返回与你已经使用的迭代器相同的引用.但我想看看来源也会解决这个问题.这里有一个链接给任何好奇的人,因为这是一个习惯我想要更好的:http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/ UTIL/ArrayList.java#ArrayList.listIterator%28%29 (3认同)

Ale*_*ien 20

最好不要使用LinkedList,通常它在所有学科中都比较慢,而且不那么方便.(当主要插入/删除前面时,特别是对于大数组LinkedList更快)

使用ArrayList,并迭代

int len = list.size();
for (int i = 0; i < len; i++) {
  Element ele = list.get(i);
}
Run Code Online (Sandbox Code Playgroud)

重置是微不足道的,只需重新循环.
如果你坚持使用迭代器,那么你必须使用一个新的迭代器:

iter = list.listIterator();
Run Code Online (Sandbox Code Playgroud)

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

  • 当删除和插入主要到前面时,LinkedList更快. (7认同)
  • 在LinkedList的情况下,即使从中间删除项目也更快.也就是说,如果您使用iterator.remove()迭代并删除项目.ArrayList需要移动剩余的项目. (2认同)

tka*_*000 9

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

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

调用hasNext()会将迭代器光标重置为开头,如果它结束的话.


Mas*_*rHD 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

您必须预先定义该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.
}
Run Code Online (Sandbox Code Playgroud)


rye*_*nus 5

如果顺序无关紧要,我们可以使用和方法使用相同的迭代器向后重新迭代:hasPrevious()previous()

ListIterator<T> lit = myList.listIterator(); // create just one iterator
Run Code Online (Sandbox Code Playgroud)

最初迭代器位于开头,我们进行前向迭代:

while (lit.hasNext()) process(lit.next()); // begin -> end
Run Code Online (Sandbox Code Playgroud)

然后迭代器位于最后,我们可以进行反向迭代:

while (lit.hasPrevious()) process2(lit.previous()); // end -> begin
Run Code Online (Sandbox Code Playgroud)