如何实现支持next()/previous()的列表迭代器(替代ListIterator)
自定义双向迭代器实现需求
原生ListIterator的游标逻辑是位于元素间隙之间,而非指向具体元素,这导致它的行为不符合你的预期:
- 初始游标在第一个元素(1)之前
- 第一次
next()返回1,游标移动到1和2之间 - 第二次
next()返回2,游标移动到2和3之间 - 调用
previous()返回游标前的元素2,游标回到1和2之间
而你需要的是游标指向当前元素的逻辑:next()移动到下一个元素并返回它,previous()移动到上一个元素并返回它。Android平台没有现成的迭代器满足这个需求,你可以通过以下方式实现:
Kotlin 简洁安全实现
封装一个自定义双向迭代器,维护当前元素索引,加入越界安全检查:
class NavigableListIterator<T>(private val list: List<T>) { private var currentIndex = -1 fun next(): T { check(currentIndex < list.lastIndex) { "无可用下一个元素" } currentIndex++ return list[currentIndex] } fun previous(): T { check(currentIndex > 0) { "无可用上一个元素" } currentIndex-- return list[currentIndex] } // 辅助方法:判断是否有下一个/上一个元素 fun hasNext(): Boolean = currentIndex < list.lastIndex fun hasPrevious(): Boolean = currentIndex > 0 }
使用示例
val list = listOf(1,2,3,4,5) val iterator = NavigableListIterator(list) println(iterator.next()) // 1 println(iterator.next()) // 2 println(iterator.previous()) // 1
代码说明
currentIndex初始为-1,表示迭代器尚未指向任何元素next()/previous()先通过check做越界校验,再修改索引并返回对应元素,避免模糊的数组越界错误- 可选的
hasNext()/hasPrevious()方法可以提前判断是否能安全调用导航方法
Java 兼容实现
如果需要Java版本的迭代器,逻辑完全一致:
import java.util.List; import java.util.NoSuchElementException; public class NavigableListIterator<T> { private final List<T> list; private int currentIndex = -1; public NavigableListIterator(List<T> list) { this.list = list; } public T next() { if (currentIndex >= list.size() - 1) { throw new NoSuchElementException("No next element available"); } currentIndex++; return list.get(currentIndex); } public T previous() { if (currentIndex <= 0) { throw new NoSuchElementException("No previous element available"); } currentIndex--; return list.get(currentIndex); } public boolean hasNext() { return currentIndex < list.size() - 1; } public boolean hasPrevious() { return currentIndex > 0; } }
注意事项
- 如果需要支持空列表,可在构造方法中添加空值检查
- 若迭代过程中列表会被修改(如使用
MutableList),需额外处理索引失效问题
内容的提问来源于stack exchange,提问作者Mustafa Tatarhan
相关产品推荐
相关产品推荐

