如何遍历列表,如果到达末尾则返回第一个元素?

时间:2020-09-25 21:34:46

标签: java list loops

所以我有一个对象列表。我想使用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());
}

4 个答案:

答案 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());
}