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

Kotlin中是否存在移除无后续content的header元素的集合操作符?

嘿,这个需求确实没有直接对应的单一集合操作符,但咱们可以用Kotlin里的基础集合操作组合出来,几种方式都能实现,我给你列几个常用的方案:

方案1:用fold带状态构建新列表

这个方法不会修改原列表,而是生成一个新的过滤后的列表,核心是用fold暂存待确认的header,遇到content时再把对应的header和content一起加入结果:

val filteredList = headersAndContent.fold(
    Pair(mutableListOf<Pair<Int, String>>(), null as Pair<Int, String>?)
) { (accList, pendingHeader), current ->
    when {
        current.second == "content" -> {
            // 如果有暂存的header,先加入列表
            pendingHeader?.let { accList.add(it) }
            // 加入当前content
            accList.add(current)
            // 清空暂存的header
            Pair(accList, null)
        }
        else -> {
            // 当前是header,替换掉之前的暂存header(之前的header没有后续content,直接丢弃)
            Pair(accList, current)
        }
    }
}.first

方案2:通过索引标记保留元素

先找出所有需要保留的元素索引,再过滤列表,逻辑更直观:

val keepIndices = mutableSetOf<Int>()

headersAndContent.forEachIndexed { index, pair ->
    if (pair.second == "content") {
        // 保留当前content的索引
        keepIndices.add(index)
        // 如果前一个元素是header,也保留它的索引
        if (index > 0 && headersAndContent[index - 1].second == "header") {
            keepIndices.add(index - 1)
        }
    }
}

val filteredList = headersAndContent.filterIndexed { index, _ -> index in keepIndices }

方案3:直接修改原MutableList(反向遍历)

如果想直接修改原列表,推荐反向遍历(避免正向遍历移除元素导致的索引混乱):

var i = headersAndContent.size - 1
while (i >= 0) {
    val current = headersAndContent[i]
    if (current.second == "header") {
        // 检查下一个元素是否存在且是content
        val hasFollowContent = (i + 1 < headersAndContent.size) && 
                               headersAndContent[i + 1].second == "content"
        if (!hasFollowContent) {
            headersAndContent.removeAt(i)
        }
    }
    i--
}

这几个方案都能满足你的需求,你可以根据是否要修改原列表、代码可读性偏好来选择~

内容的提问来源于stack exchange,提问作者pixel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:55:36