给定有限数量的排序无限流。如何将这些流合并为单个排序的无限流?例如:
def merge[T](ss: List[Stream[T]]): Stream[T]发布于 2018-03-19 21:17:00
你可以做这样的事
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)
}这将从小到大,它假设流是以同样的方式排列的。
发布于 2018-03-19 23:19:53
使用此签名创建一个支持无限流的方法是不可能的。您将耗尽内存,因为在执行过程中,原始流的所有元素都在作用域中。请阅读这篇文章以获得解释http://blog.dmitryleskov.com/programming/scala/stream-hygiene-i-avoiding-memory-leaks/。
发布于 2018-03-19 23:17:32
排序位可能与排序无关,因为您需要严格地对流进行排序(然后流不是您想要的类型)。但是,您可以保留元素计算的“顺序”。
我可能会尝试这样的方法:
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)
1https://stackoverflow.com/questions/49371444
复制相似问题