所以我有一个对象列表。我想使用ListIterator遍历它们,但是我希望.next()如果第一个元素到达末尾,则返回第一个元素,并再次遍历列表。有可能吗?
ListIterator<Post> postsIterator = posts.listIterator(); //posts only has 3 elements
for (int i = 0; i < 15; i++)
{
System.out.println(postsIterator.next().getText());
}
答案 0 :(得分:5)
ListIterator<Post> it = posts.listIterator();
for (int i = 0; i < 15; i++) {
it = it.hasNext() ? it : it.listIterator();
System.out.println(it.next().getText());
}
答案 1 :(得分:3)
您可以使用一些流魔术来创建实际上永远持续的迭代器:
List<String> strings = Arrays.asList("one", "two", "three");
Iterator<String> it = Stream.generate(() -> strings).flatMap(List::stream).iterator();
for (int i = 0; i < 15; ++i) {
System.out.println(it.next());
}
如果有可用的番石榴,则有一种方法Iterators.cycle(Iterable)
可以满足您的需求。
也许更简单的方法是避免完全使用迭代器:
List<String> strings = Arrays.asList("one", "two", "three");
for (int i = 0; i < 15; ++i) {
System.out.println(strings.get(i % strings.size()));
}
答案 2 :(得分:2)
一旦结束,您需要将ListIterator
重置为索引0
。
演示:
import java.util.List;
import java.util.ListIterator;
public class Main {
public static void main(String[] args) {
List<String> list = List.of("A", "B", "C");
ListIterator<String> itr = list.listIterator();
for (int i = 0; i < 15; i++) {
if (!itr.hasNext()) {
itr = list.listIterator();
}
System.out.print(itr.next() + "\t");
}
}
}
输出:
A B C A B C A B C A B C A B C
答案 3 :(得分:2)
为什么不简单地跟踪您的迭代变量?像这样:
ListIterator<Post> postsIterator = posts.listIterator(); //posts only has 3 elements
for (int i = 0; i < posts.size(); i++) {
if (!postsIterator.hasNext()) break;
Post post = postsIterator.next();
System.out.println(post==null ? "" : post.getText());
if (i==posts.size()-1) {
i=-1; //to make sure that increment gets to 0
}
}
如果您坚持要设置硬编码的阈值15
,则:
ListIterator<Post> postsIterator = posts.listIterator(); //posts only has 3 elements
for (int i = 0; i < 15; i++) {
if (!postsIterator.hasNext()) postsIterator = posts.listIterator();
Post post = postsIterator.next();
System.out.println(post==null ? "" : post.getText());
}