Scala 合并已排序的无限流
给定有限个排序的无限流。如何将这些流合并成单个排序的无限流?e、 gScala 合并已排序的无限流,scala,stream,Scala,Stream,给定有限个排序的无限流。如何将这些流合并成单个排序的无限流?e、 g def merge[T](ss: List[Stream[T]]): Stream[T] 你可以这样做 def merge[T: Ordering](ss: List[Stream[T]]): Stream[T] = { val str = ss.minBy(_.head) val (containsMin, rest) = ss.partition(_.head == str.head) conta
def merge[T](ss: List[Stream[T]]): Stream[T]
你可以这样做
def merge[T: Ordering](ss: List[Stream[T]]): Stream[T] = {
val str = ss.minBy(_.head)
val (containsMin, rest) = ss.partition(_.head == str.head)
containsMin.map(_.head).toStream #::: merge(containsMin.map(_.tail) ++ rest)
}
这需要从小到大,假设流是以同样的方式排序的您可以这样做
def merge[T: Ordering](ss: List[Stream[T]]): Stream[T] = {
val str = ss.minBy(_.head)
val (containsMin, rest) = ss.partition(_.head == str.head)
containsMin.map(_.head).toStream #::: merge(containsMin.map(_.tail) ++ rest)
}
这将从小到大,并且假设流以相同的方式排序排序的位可能与排序无关,因为您需要严格评估流(那么流不是您想要的类型)。但是您可以保持元素求值的“顺序” 我可能会尝试这样的方法:
scala> val s1 = Stream.from(1)
scala> val s2 = Stream.from(1000)
scala> val streams = List(s1, s2)
scala> val newStream: Stream[Int] =
streams.foldRight(Stream.empty[Int])(
(xs, xss) => xss #::: xs))
scala> newStream.headOption.foreach(println)
1
排序的位可能与排序无关,因为您需要对流进行严格评估(那么流不是您想要的类型)。但是您可以保持元素求值的“顺序” 我可能会尝试这样的方法:
scala> val s1 = Stream.from(1)
scala> val s2 = Stream.from(1000)
scala> val streams = List(s1, s2)
scala> val newStream: Stream[Int] =
streams.foldRight(Stream.empty[Int])(
(xs, xss) => xss #::: xs))
scala> newStream.headOption.foreach(println)
1
不可能创建具有此签名的支持无限流的方法。您将耗尽内存,因为原始流的所有元素在执行期间都在作用域中。
请阅读本文以获得解释。不可能创建具有此签名的方法来支持无限流。您将耗尽内存,因为原始流的所有元素在执行期间都在作用域中。
请阅读本文进行解释。请阅读以下内容:“请求家庭作业帮助的问题必须包括您迄今为止为解决问题所做工作的摘要,以及您解决问题的困难描述”请阅读:“要求家庭作业帮助的问题必须包括到目前为止你为解决问题所做的工作的摘要,以及你解决问题所遇到的困难的描述”谢谢你,我从你的解决方案中得出了一点。但是所有的学分都是你的def mergeSortedStreams[T](ss:List[Stream[T])(隐式ord:T=>Ordered[T]):Stream[T]={val-nss=ss.filter(.nonEmpty)if(nss.isEmpty)Empty else{val-min=nss.minBy(.head)val-oss=nss.filter(!=min)min.head::mergeSortedStreams(min.tail+:oss)}谢谢你,我从你的解决方案中得到了一点。但是所有的积分都是你的def-mergeSortedStreams[T](ss:List[Stream[T]))(隐式ord:T=>Ordered[T]):流[T]={val nss=ss.filter(.nonEmpty)if(nss.isEmpty)Empty else{val min=nss.minBy(.head)val oss=nss.filter(!=min)min.head::mergeSortedStreams(min.tail+:oss)}