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

Scala中如何为除最后一个子列表外的所有子列表添加末尾0?

解决Scala中给List of Lists除最后一个子列表外添加末尾0的问题

嘿,这个需求其实用Scala的列表操作很容易优雅解决的~你之前用flatMap和foldLeft踩的坑我懂,因为它们会遍历所有子列表,没法直接区分最后一个元素,所以才会给所有子列表都加0。

这里有两种很直观的实现方式,都是Scala风格的:

方法一:用init和last拆分列表

如果你的列表非空,init会返回除最后一个元素外的所有子列表,last取到最后一个子列表。我们只需要给init里的每个子列表追加0,再把原最后一个子列表拼回去就行:

val input = List(List(1, 2), List(3, 4), List(5, 6))
val result = if (input.isEmpty) input else input.init.map(_ :+ 0) :+ input.last
// 结果:List(List(1, 2, 0), List(3, 4, 0), List(5, 6))

这个方法很简洁,而且会处理空列表的边界情况。

方法二:模式匹配(更具Scala特色)

用Scala的模式匹配可以更清晰地表达“拆分出最后一个元素”的逻辑,可读性拉满:

val input = List(List(1, 2), List(3, 4), List(5, 6))
val result = input match {
  case Nil => Nil // 空列表直接返回
  case init :+ last => init.map(_ :+ 0) :+ last // 拆分出前面的子列表和最后一个,处理后拼接
}
// 结果和上面一致

这种方式不需要额外的空列表判断,模式匹配会自动处理所有情况,包括原列表只有一个子列表的情况(此时init是空列表,不会执行map,直接返回原列表)。

如果你之前尝试的foldLeft想改的话,其实也可以,但需要跟踪是否是最后一个元素,反而不如上面两种方法简洁。比如需要记录当前索引或者剩余元素数量,反而增加了复杂度,不如直接拆分列表来得优雅。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:36:40