gpt4 book ai didi

scala - 折叠 Scala 序列中匹配元素的子序列

转载 作者:行者123 更新时间:2023-12-03 19:33:48 25 4
gpt4 key购买 nike

给定一个 Scala 序列...

val sequence: Seq = List( 3, 1, 4, 1, 5, 9, 2, 6, 5 )

...说我想找到符合特定条件的所有子序列,例如奇数串,并用对该子序列的某些操作的结果替换它们,比如它的长度,产生一个新序列:

val sequence2: Seq = List( 2, 4, 3, 2, 6, 1 )

(是的,这是一个相当人为的例子,但它很简洁。)

到目前为止,我能做的最好的事情就是这个丑陋的命令式 hack:

val sequence: Seq[Int] = List( 3, 1, 4, 1, 5, 9, 2, 6, 5 )

var sequence2 = List[Int]() // this is going to be our result
var subsequence = List[Int]()

for (s <- sequence) {
if (s % 2 == 0) {
if (!subsequence.isEmpty) {
sequence2 = sequence2 :+ subsequence.length
subsequence = List[Int]()
}
sequence2 = sequence2 :+ s
} else {
subsequence = subsequence :+ s
}
}

if (!subsequence.isEmpty) {
sequence2 = sequence2 :+ subsequence.length
}

是否有一种优雅(/实用)的方式来做到这一点?

最佳答案

使用 multiSpan为了根据给定的标准将列表分成子列表,请考虑针对上述问题的此解决方案,

sequence.multiSpan( _ % 2 == 0 ).flatMap {
case h :: xs if h % 2 != 0 => List( (h::xs).length)
case h :: Nil => List(h)
case h :: xs => List(h, xs.length) }

注意

sequence.multiSpan( _ % 2 == 0 )
List(List(3, 1), List(4, 1, 5, 9), List(2), List(6, 5))

因此我们通过考虑三种情况来 flatMap 这些嵌套列表:是否条件不成立,因此我们应用一个函数;是否为单例列表(条件成立);或者第一个元素是否成立,其余元素是否需要应用一个函数。

关于scala - 折叠 Scala 序列中匹配元素的子序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28596564/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com