Scala多序列组合异常:期望输出与实际输出不符的问题排查
问题分析与解决方法
首先咱们得搞明白你原来的代码为啥会得到不符合预期的结果:
你用的(aa, bb, cc).zipped是按索引一对一绑定三个序列的元素,也就是:
- aa的第1个元素(1)和bb的第1个子序列、cc的第1个字符串("a")组成一组
- aa的第2个元素(2)和bb的第2个子序列、cc的第2个字符串("B")组成一组
然后你在flatMap里把每个组里的b子序列的所有元素和同一个a配对,自然就出现了(1,2.0,a), (1,3.0,a)...这种结果——因为aa的第一个元素和bb第一个子序列的所有元素绑定了,而不是aa的每个元素和bb子序列的对应位置元素配对。
正确的实现方式
我们需要调整配对的顺序:先把每个字符串(cc的元素)和对应的bb子序列绑定,然后再让aa的元素和对应子序列的元素按位置配对,最后组合成三元组。代码如下:
val aa = Seq(1,2,3,4) val bb = Seq(Seq(2.0,3.0,4.0,5.0), Seq(1.0,2.0,3.0,4.0)) val cc = Seq("a", "B") val desiredResult = cc.zip(bb).flatMap { case (c, bSeq) => // 把aa和bSeq按位置一一配对,再加上当前的字符串c aa.zip(bSeq).map { case (a, b1) => // 如果需要把"B"转成小写"b",就用c.toLowerCase,否则直接用c (a, b1, c.toLowerCase) } } // 输出结果: // List((1,2.0,a), (2,3.0,a), (3,4.0,a), (4,5.0,a), (1,1.0,b), (2,2.0,b), (3,3.0,b), (4,4.0,b))
代码逻辑拆解:
cc.zip(bb):把每个字符串和对应的数值子序列绑定,得到Seq(("a", Seq(2.0,3.0,4.0,5.0)), ("B", Seq(1.0,2.0,3.0,4.0)))- 对每一对
(c, bSeq),用aa.zip(bSeq)将aa的元素和bSeq的元素按索引一一配对,比如aa的1配bSeq的2.0,aa的2配bSeq的3.0,以此类推 - 最后把字符串c(这里转成了小写,符合你期望的"b")加入,形成目标三元组,
flatMap把所有组的结果展平成一个单一序列
内容的提问来源于stack exchange,提问作者Georg Heiler
相关产品推荐
相关产品推荐

