【问题标题】:Merging two lazy lists in Scala在 Scala 中合并两个惰性列表
【发布时间】:2018-05-07 10:24:21
【问题描述】:

谁能帮帮我? 我需要创建函数«lazymerge»,它从两个排序的惰性列表中生成一个新的排序列表。您需要使用流。 示例:[1;3;5;7;9;11] 和 [2;4;6;8] 给你 [1;2;3;4;5;6;7;8;9;11]

我什么都试过了 :( 此外,它必须以功能样式完成。

【问题讨论】:

  • 请展示您目前尝试过的内容。
  • 不工作。
  • 即使它不起作用,你也应该分享你到目前为止所做的事情。这就是我们如何找出它不起作用的方法。这就是 SO 的工作原理。请阅读:How do I ask a good question ?
  • val sorted = (listFirst++listSecond).sorted
  • “你需要使用流”的人的变化是一个死的赠品,这是一个任务。

标签: scala list merge functional-programming


【解决方案1】:

您需要比较两个流的当前头,并使用较小的一个作为每次迭代的最终流的当前头。

val intStream1 = 1 #:: 5 #:: Stream(10)

val intStream2 = 2 #:: 4 #:: Stream(12)

def sortedMerge(stream1: Stream[Int], stream2: Stream[Int]): Stream[Int] = (stream1.isEmpty, stream2.isEmpty) match {
  case (false, false) => (stream1.head <= stream2.head) match {
    case true => stream1.head #:: sortedMerge(stream1.tail, stream2)
    case false => stream2.head #:: sortedMerge(stream1, stream2.tail)
  }
  case (false, true) => stream1
  case (true, false) => stream2
  case (true, true) => Stream.empty[Int]
}
}

val sortedStream = sortedMerge(intStream1, intStream2)

【讨论】:

  • @WillNess 我也希望反对者在 cmets 中提出他们的担忧。目前还是个谜。
  • 可能是因为this的原因。顺便说一句,“orderedMerge”可能是一个更好的选择。 (你也忘了重命名递归调用)。
  • 可能是。但是 Scala 中的 Streams 可能会让初学者感到困惑。
猜你喜欢
  • 2020-12-28
  • 1970-01-01
  • 1970-01-01
  • 2021-05-12
  • 2017-04-03
  • 2011-11-29
  • 1970-01-01
  • 1970-01-01
  • 2017-01-28
相关资源
最近更新 更多