2014-09-30 54 views
2

我使用枚举器/ iteratee从Play框架 我有几个枚举器,每个提供排序的值序列。我想编写Iteratee/Enumeratee合并来自这些枚举器的值,以提供所有值的排序顺序。 使用Iteratee或我应该直接实现enumeratee是一个好主意吗? 我知道我可以从枚举器压缩值并在内存中重建其数据流,然后合并这些数据。如何合并来自统计员的数据是斯卡拉

但我想知道是否有办法实现“经典”合并排序 - 从所有枚举器“读取”第一个值,然后选择最小值,然后让枚举器提供它来读取另一个值(而其他统计员被搁置)。因此,我希望枚举提供结果排序序列,而不将所有流存储在内存中。我想遵循功能风格 - 保持一切不变。

感谢您的意见。

回答

0

您仍然需要在内存中的标准集合中进行一些插入排序。想象一下这种病理情况:

Enumerator(3, 2, 1) and Enumerator(4, -1 , -2, -3) 

在这里,你不能只采取最小的元素,并在你的收集结束。随着时间的推移,您将不得不将值放在集合中的任意位置。这是从根本上排序的一部分,就是你必须知道你必须分类的全部范围,以便以比这更快的速度进行分类。 (桶排序是线性时间排序算法假设你知道你正在尝试排序值的分布)


为了更具体地解决你的问题:

枚举/ iteratee库是不是真的足以表达你的用例。如果您想合并统计员,您可以使用Enumerator.interleave,并在您的Iteratee中进行一些插入排序操作,并首先插入任何元素。

如果这个机制对你很重要,你可以考虑使用最近发布的Akka Streams,你可以使用它实现一个自定义的FlexiMerge推/拉舞台,这将允许你做你想要的。