gpt4 book ai didi

scala - 组合序列的惯用 Scala 解决方案

转载 作者:行者123 更新时间:2023-12-02 00:05:01 26 4
gpt4 key购买 nike

设想一个函数 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 解决方案。我现在已经遇到过几次相关问题。

最佳答案

当然不是最优化的解决方案,但我已经考虑了可读性。

def combineSequences[T]( seqs: Set[Seq[T]] ): Set[Seq[T]] = {
if ( seqs.isEmpty ) seqs
else {
val (seq1, otherSeqs) = (seqs.head, seqs.tail)
otherSeqs.find(_.headOption == seq1.lastOption) match {
case Some( seq2 ) => combineSequences( otherSeqs - seq2 + (seq1 ++ seq2) )
case None =>
otherSeqs.find(_.lastOption == seq1.headOption) match {
case Some( seq2 ) => combineSequences( otherSeqs - seq2 + (seq2 ++ seq1) )
case None => combineSequences( otherSeqs ) + seq1
}
}
}
}

REPL 测试:

scala> val seqs = Set(Seq(1, 2), Seq(2, 3), Seq(5, 6, 7, 8), Seq(8, 9, 10), Seq(3, 4, 10))
seqs: scala.collection.immutable.Set[Seq[Int]] = Set(List(1, 2), List(2, 3), List(8, 9, 10), List(5, 6, 7, 8), List(3, 4, 10))
scala> combineSequences( seqs )
res10: Set[Seq[Int]] = Set(List(1, 2, 2, 3, 3, 4, 10), List(5, 6, 7, 8, 8, 9, 10))
scala> val seqs = Set(Seq(1, 2), Seq(2, 3, 100), Seq(5, 6, 7, 8), Seq(8, 9, 10), Seq(100, 4, 10))
seqs: scala.collection.immutable.Set[Seq[Int]] = Set(List(100, 4, 10), List(1, 2), List(8, 9, 10), List(2, 3, 100), List(5, 6, 7, 8))
scala> combineSequences( seqs )
res11: Set[Seq[Int]] = Set(List(5, 6, 7, 8, 8, 9, 10), List(1, 2, 2, 3, 100, 100, 4, 10))

关于scala - 组合序列的惯用 Scala 解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18906205/

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