给定有限数量的有序无限流。如何将这些流合并为单个排序的无限流? e.g。
def merge[T](ss: List[Stream[T]]): Stream[T]
答案 0 :(得分:4)
你可以做这样的事情
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)
}
这将从较小到较大,并假设流以相同的方式排序
答案 1 :(得分:1)
创建一个支持无限流的签名的方法是不可能的。由于原始流的所有元素在执行期间都在范围内,因此内存不足。 请阅读本文以获取解释http://blog.dmitryleskov.com/programming/scala/stream-hygiene-i-avoiding-memory-leaks/。
答案 2 :(得分:0)
排序位可能不相关,因为能够排序您需要严格评估流(然后Stream不是您想要的类型)。但你可以保持"命令"评估元素的位置。
我可能会尝试这样的事情:
Starting 'watch'...
Finished 'watch' after 7.99 ms