【发布时间】:2013-09-19 22:51:02
【问题描述】:
想象一个函数combineSequences: (seqs: Set[Seq[Int]])Set[Seq[Int]],它在第一个序列的最后一项与第二个序列的第一项匹配时组合序列。例如,如果您有以下序列:
(1, 2)
(2, 3)
(5, 6, 7, 8)
(8, 9, 10)
(3, 4, 10)
combineSequences 的结果是:
(5, 6, 7, 8, 8, 9, 10)
(1, 2, 2, 3, 3, 4, 10)
因为序列 1、2 和 5 组合在一起。如果多个序列可以组合以产生不同的结果,则决定是任意的。例如,如果我们有序列:
(1, 2)
(2, 3)
(2, 4)
有两个正确答案。要么:
(1, 2, 2, 3)
(2, 4)
或者:
(1, 2, 2, 4)
(2, 3)
我只能想到一个非常必要且相当不透明的实现。我想知道是否有人有更惯用的scala解决方案。我已经遇到过几次相关的问题了。
【问题讨论】:
-
第一个结果应该是 (5,6,7,8,8,9,10) 和 (1,2,2,3,3,4,10) 对吧?
-
xs.map(y => xs.foldLeft[Seq[Int]](y)((acc, b) => if(acc.last == b.head) acc ++ b ; else acc)) 最好我能在深夜想出这个。它把原件留在了场景中,所以不是一个完整的解决方案,但可能会让你走上正确的轨道
-
我也很难在功能上进行思考。我最近写了一篇应该对你有帮助的博文:Map, reduce, and fold for the programmatically imperative | prose :: and :: conz
-
您应该改用
SortedSet[Seq[Int]],因为Set不能保证您所依赖的序列的顺序。 -
@Chirlo 这对于解决方案来说不是必需的,特别是因为他不在乎他得到哪些可能的正确答案。
标签: scala functional-programming sequence seq