首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >合并排序无限流

合并排序无限流
EN

Stack Overflow用户
提问于 2018-03-19 20:01:10
回答 3查看 747关注 0票数 1

给定有限数量的排序无限流。如何将这些流合并为单个排序的无限流?例如:

代码语言:javascript
运行
复制
def merge[T](ss: List[Stream[T]]): Stream[T]
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-03-19 21:17:00

你可以做这样的事

代码语言:javascript
运行
复制
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)
  }

这将从小到大,它假设流是以同样的方式排列的。

票数 4
EN

Stack Overflow用户

发布于 2018-03-19 23:19:53

使用此签名创建一个支持无限流的方法是不可能的。您将耗尽内存,因为在执行过程中,原始流的所有元素都在作用域中。请阅读这篇文章以获得解释http://blog.dmitryleskov.com/programming/scala/stream-hygiene-i-avoiding-memory-leaks/

票数 1
EN

Stack Overflow用户

发布于 2018-03-19 23:17:32

排序位可能与排序无关,因为您需要严格地对流进行排序(然后流不是您想要的类型)。但是,您可以保留元素计算的“顺序”。

我可能会尝试这样的方法:

代码语言:javascript
运行
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49371444

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档