Elixir:流入跑步

Gav*_*aff 3 stream elixir

我想一个列表(预先排序),如

[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

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

sas*_*ric 7

我认为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]]
Run Code Online (Sandbox Code Playgroud)

或者使用捕获语法:

iex(2)> [1,1,1,2,2,2,2,2,2,3,3,4] |> Enum.chunk_by(&(&1))
Run Code Online (Sandbox Code Playgroud)

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

bit*_*ker 5

我会用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]]]
Run Code Online (Sandbox Code Playgroud)

简单!