You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现支持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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 00:26:18