我需要知道如何将LinkedList迭代器“重置”到它的第一个元素。
例如:
LinkedList<String> list;
Iterator iter=list.listIterator;
iter.next();
iter.next();
一遍又一遍,经过迭代器的多次移动后,我需要“重置”迭代器的位置。 `
我想问一下如何将我的迭代器“重置”到第一个元素
我知道我可以用这种方式得到第一个元素的列表迭代器:
iter= list.listIterator(1);
这是最好的解决方案吗?或者我可能错过了Oracle文档中的某些内容?
答案 0 :(得分:41)
您可以再次调用listIterator
方法以获取指向列表开头的迭代器实例:
iter = list.listIterator();
答案 1 :(得分:19)
最好不要使用LinkedList
,通常它在所有学科中都比较慢,而且不太方便。 (当主要插入/删除前面时,特别是对于大数组LinkedList更快)
使用ArrayList
,并使用
int len = list.size();
for (int i = 0; i < len; i++) {
Element ele = list.get(i);
}
重置是微不足道的,只需重新循环。
如果你坚持使用迭代器,那么你必须使用一个新的迭代器:
iter = list.listIterator();
(我生命中只见过一次LinkedList的优势:我可以循环播放一个while循环并删除第一个元素)
答案 2 :(得分:9)
这是一种替代解决方案,但人们可能会认为它没有增加足够的价值以使其值得:
import com.google.common.collect.Iterables;
...
Iterator<String> iter = Iterables.cycle(list).iterator();
if(iter.hasNext()) {
str = iter.next();
}
调用hasNext()会将迭代器光标重置为开头,如果结束的话。
答案 3 :(得分: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
答案 4 :(得分:0)
在Collection impl上调用iterator()
,可能会在每次调用时获得一个新的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
答案 5 :(得分:0)
您可能真正想使用的是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();
}
}
您必须事先定义一次itertor()
方法的作用:
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.
}
答案 6 :(得分:0)
您可以做的是,使用 while 循环将迭代器手动设置到第一个位置。
while(iter.hasPrevious())
{
iter.previous();
}
当您退出循环时,您的迭代器将位于位置 0