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

