Java 如何遍历列表并在到达末尾时返回到第一个元素?

Java 如何遍历列表并在到达末尾时返回到第一个元素?,java,list,loops,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()); }

所以我有一个对象列表。我想用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());
}
ListIterator postsIterator=posts.ListIterator()//posts只有3个元素
对于(int i=0;i<15;i++)
{
System.out.println(postsIterator.next().getText());
}
ListIterator it=posts.ListIterator();
对于(int i=0;i<15;i++){
it=it.hasNext()?it:it.listIterator();
System.out.println(it.next().getText());
}
ListIterator it=posts.ListIterator();
对于(int i=0;i<15;i++){
it=it.hasNext()?it:it.listIterator();
System.out.println(it.next().getText());
}

您需要将
列表迭代器
重置为索引,
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   

当列表迭代器到达末尾时,需要将其重置为索引
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   

您可以使用一些流魔法来创建一个迭代器,该迭代器实际上可以永远运行:

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

您可以使用一些流魔法来创建一个迭代器,该迭代器实际上可以永远运行:

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

为什么不简单地跟踪迭代变量呢?像这样:

ListIterator postsIterator=posts.ListIterator()//posts只有3个元素
对于(int i=0;i
如果您坚持要硬编码阈值
15
,则:

ListIterator postsIterator=posts.ListIterator()//posts只有3个元素
对于(int i=0;i<15;i++){
如果(!postsIterator.hasNext())postsIterator=posts.listIterator();
Post Post=postsIterator.next();
System.out.println(post==null?“:post.getText());
}

为什么不简单地跟踪迭代变量?像这样:

ListIterator postsIterator=posts.ListIterator()//posts只有3个元素
对于(int i=0;i
如果您坚持要硬编码阈值
15
,则:

ListIterator postsIterator=posts.ListIterator()//posts只有3个元素
对于(int i=0;i<15;i++){
如果(!postsIterator.hasNext())postsIterator=posts.listIterator();
Post Post=postsIterator.next();
System.out.println(post==null?“:post.getText());
}

只有
12
元素(而不是
15
)@oleg.cherednik-感谢您指出这一点。现在更正。只有
12
元素(不是
15
)@oleg.cherednik-感谢您指出这一点。现在更正它。你不需要做'i-=2'吗,因为它被i++抵消了吗?当
i
到达
size()-1
时,我们首先获取元素,然后重置
i
。我不确定我是否完全理解你的意思。你不需要做'I-=2'吗,因为它被I++抵消了吗?当
I
达到
size()-1
时,我们首先获取元素,然后重置
I
。我不确定我是否完全理解你的意思。
()->strings
需要一些解释。因此
()->strings
是一个供应商lambda表达式。执行它的结果是
字符串
列表。然后,
flatMap(List::stream)
将列表转换为流,然后作为迭代器返回。请参见Javadoc中的
流。此处生成(…)
()->strings
需要一些解释。因此
()->strings
是一个供应商lambda表达式。执行它的结果是
字符串
列表。然后,
flatMap(List::stream)
将列表转换为流,然后作为迭代器返回。请参见Javadoc中的
流。在此处生成(…)