【问题标题】:Elixir: Streaming into runsElixir:流式传输
【发布时间】:2015-02-02 05:15:26
【问题描述】:

我想流式传输一个列表(预先排序),例如

[1,1,1,2,2,2,2,2,2,3,3,4]

所以它被分成这样的运行

[[1,1,1],[2,2,2,2,2,2],[3,3],[4]]

有没有一种巧妙的方法来做到这一点?

我一直在学习: Stream.transform, Stream.take_while, Enum.split_while, Enum.partition, Enum.flat_map_reduce

最后我需要将答案从数字列表扩展到包含数字的元组

【问题讨论】:

  • 我认为你最好的办法是尝试像zipping 列表本身移动一个,这样你就得到一个包含一个元素及其后继的元组的列表。一旦你有了它,你可以scan 来建立这个列表。

标签: stream elixir


【解决方案1】:

我认为Enum.chunk_by/2(还有一个Stream 版本)可以解决问题:

iex(1)> [1,1,1,2,2,2,2,2,2,3,3,4] |> Enum.chunk_by(fn(x) -> x end)
[[1, 1, 1], [2, 2, 2, 2, 2, 2], [3, 3], [4]]

或者使用捕获语法:

iex(2)> [1,1,1,2,2,2,2,2,2,3,3,4] |> Enum.chunk_by(&(&1))

【讨论】:

  • sasajuric 优秀!我没有在文档中看到 chunk_by 使用 fn -。它也可以使用 Stream.chunk_by(fn(x) -> x end) - 这是我的情况。我认为你的答案,
【解决方案2】:

我会使用Stream.chunk_by:

Stream.chunk_by(nums, fn num -> num end) |> Enum.to_list
#> [[1,1,1], [2,2,2,2,2,2], [3,3], [4]]]

简单!

【讨论】:

  • 该死,我希望在发布之前刷新答案:/
  • 先生,你回答得好才是关键!
  • 我喜欢这里的 Elixir 人看起来很放松。我经常看到关于谁先回答的激烈辩论,人们严厉地反对所谓的“骗子”等等。让我们保持这种状态;-)
  • 那是因为我们知道并发是如何工作的,并且我们知道竞态条件:-D
猜你喜欢
  • 2015-03-21
  • 2016-09-29
  • 1970-01-01
  • 2020-07-17
  • 2012-05-18
  • 2014-03-29
  • 2011-03-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多