2014-09-30 60 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推/拉舞臺,這將允許你做你想要的。