Scala中如何将序列组合映射后的嵌套结果扁平化处理?
解决Scala序列组合后的扁平化问题
嘿,这个需求其实很好实现,核心就是在你现有的zipped.map基础上,加上**扁平化(flatMap)**操作来拆解嵌套的序列。我给你两种直观的实现方式:
方法1:先映射再扁平化
先按你原来的逻辑得到包含嵌套序列的元组列表,再通过flatMap把每个嵌套序列里的元素逐个拆出来,和对应的外层值组合:
val seq1 = Seq(1,2,3,4,5) val seq2 = Seq(Seq(1.0, 2.0, 3.0, 4.0, 5.0), Seq(1.0, 2.0, 3.0, 4.0, 5.0), Seq(1.0, 2.0, 3.0, 4.0, 5.0)) val seq3 = Seq("a", "b", "c") // 先得到你原来的嵌套元组列表 val nestedTuples = (seq1, seq2, seq3).zipped.map((a, bSeq, c) => (a, bSeq, c)) // 扁平化处理:把每个元组里的bSeq拆成单个元素,和a、c重新组合 val flattenedResult = nestedTuples.flatMap { case (a, bSeq, c) => bSeq.map(b => (a, Seq(b), c)) // 这里把单个b包装成Seq,匹配你要的输出格式 }
方法2:链式调用更简洁
你也可以把flatMap直接跟在zipped后面,省去中间变量,代码更紧凑:
val seq1 = Seq(1,2,3,4,5) val seq2 = Seq(Seq(1.0, 2.0, 3.0, 4.0, 5.0), Seq(1.0, 2.0, 3.0, 4.0, 5.0), Seq(1.0, 2.0, 3.0, 4.0, 5.0)) val seq3 = Seq("a", "b", "c") val flattenedResult = (seq1, seq2, seq3).zipped.flatMap((a, bSeq, c) => bSeq.map(b => (a, Seq(b), c)) )
说明
- 两种方法最终都会生成你想要的结果:
List((1,List(1.0),"a"), (1,List(2.0),"a"), ..., (2,List(1.0),"b"), ...) - 如果你不需要把单个
Double值包装成Seq,直接写成(a, b, c)就行,根据你的实际需求调整。
内容的提问来源于stack exchange,提问作者Georg Heiler
相关产品推荐
相关产品推荐

