Java 中将 ListIterator 重置为列表的第一个元素

当我们使用 Java 时,高效地浏览集合是一个常见的要求。在处理列表时,ListIterator接口提供了一个强大的双向遍历工具。但是,在某些情况下,需要将ListIterator重置为第一个元素。

在本教程中,我们将探索在 Java 中将ListIterator重置到列表开头的各种方法。

假设我们有一个字符串列表:

List<String> MY_LIST = List.of("A", "B", "C", "D", "E", "F", "G");
然后,我们可以通过MY_LIST.listIterator()获取MY_LIST上的ListIterator  ,并通过调用ListIterator的next()方法迭代列表。

有时,我们可能希望通过要求ListIterator对象再次指向列表中第一个元素之前的位置来重置 ListIterator 对象,因为它是新创建的。

接下来,我们将研究解决此问题的不同方法。此外,我们将利用单元测试断言来验证每个解决方案是否给出预期结果。

当我们创建一个新的ListIterator对象时,它指向目标列表的开头。因此,重置ListIterator实例的最简单方法是将变量重新分配给新的ListIterator。

让我们创建一个测试并验证这个想法是否按预期工作:

ListIterator<String> lit = MY_LIST.listIterator();
lit.next();
lit.next();
lit.next();
lit.next();
lit = MY_LIST.listIterator();
assertFalse(lit.hasPrevious());
assertEquals("A", lit.next());

如上面的测试所示,在创建ListIterator  lit后,我​​们调用lit.next()方法四次。当我们想要重置lit时,我们创建了一个新的ListIterator实例并将其重新分配给 lit。

然后,我们通过两个断言验证lit是否重置成功:

  • lit.hasPrevious()返回false
  • lit.next()应该是MY_LIST中的第一个元素( “A” )

如果我们运行这个测试,它就会通过。因此,创建一个新的ListIterator解决了我们的问题。

向后迭代到列表的开头
创建一个新的ListIterator可以快速导航到列表的开头。但是,我们将有一个新的ListIterator对象。

有时,我们想保留原始的ListIterator对象并将其指针移回目标列表的开头。如果是这种情况,我们可以利用ListIterator的双向迭代功能向后迭代到列表的开头。

接下来,让我们创建一个测试来看看如何实现这一目标:

ListIterator<String> lit = MY_LIST.listIterator();
lit.next();
lit.next();
lit.next();
lit.next();
while (lit.hasPrevious()) {
    lit.previous();
}
assertFalse(lit.hasPrevious());
assertEquals("A", lit.next());

正如我们所看到的,我们通过while循环应用向后迭代。

如果我们运行测试,它就会通过。所以,它完成了工作。

值得注意的是,由于此方法从当前位置向后迭代到列表的开头,因此如果列表中的元素数量很大,则速度可能会很慢。