基于结构类型更改的分块列表

2024-03-22

我有一个列表,我想根据从结构类型 B 到 A 的转换来分块。例如,我有以下内容:

iex(1)> defmodule A, do: defstruct []
{:module, A ...
iex(2)> defmodule B, do: defstruct []
{:module, B ...
iex(3)> values = [ %A{}, %A{}, %B{}, %B{}, %B{}, %A{}, %A{}, %B{} ]
[%A{}, %A{}, %B{}, %B{}, %B{}, %A{}, %A{}, %B{}]

我希望将这些数据分成一个 2 元素列表,其中包含:

[ [ %A{}, %A{}, %B{}, %B{}, %B{} ], [ %A{}, %A{}, %B{} ] ]

如果输入最初全部是 A 或全部 B,则输出将保持不变,因为没有发生 B->A 转换。

我想Enum.chunk_by/2是要走的路,但我很难弄清楚如何维护前一个元素的上下文以知道何时拆分。

像这样的事情的惯用解决方案是什么样的?


另一种方法是使用纯递归:

def collect_chunks([]), do: []
def collect_chunks(list) do
  {chunk, post_chunk} = collect_chunk(list)
  [chunk | collect_chunks(post_chunk)]
end

defp collect_chunk([]), do: {[], []}
defp collect_chunk([%B{} = last_element | [%A{} | _] = post_chunk]), do: {[last_element], post_chunk}
defp collect_chunk([el | rest]) do
  {remaining_chunk, post_chunk} = collect_chunk(rest)
  {[el | remaining_chunk], post_chunk}
end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于结构类型更改的分块列表 的相关文章

随机推荐