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
相关产品推荐
相关产品推荐

