如何在elixir中替换数组中的元素

如何在elixir中替换数组中的元素,elixir,Elixir,我想用3替换所有出现的2。我不想使用索引的值,因为这将是硬编码。到目前为止,我得到的是: list=[1,2,3,4,2,34,2] replace_at(list, index, value) Enum.each list, fn(x) -> if x==2 do replace_at(list, index, 3) end Enum.each list, fn(x) -> IO.puts x end 在Elixir中,您没有数组,但是。如果您只是想用3替换2的所有

我想用3替换所有出现的2。我不想使用索引的值,因为这将是硬编码。到目前为止,我得到的是:


list=[1,2,3,4,2,34,2]

replace_at(list, index, value)

Enum.each list, fn(x) ->
if x==2 do
  replace_at(list, index, 3)
end

Enum.each list, fn(x) ->
IO.puts x
end


在Elixir中,您没有数组,但是。如果您只是想用3替换2的所有ocurrence,可以使用Enum模块的函数,如下所示:

iex(1)> Enum.map(list, fn x -> if x == 2, do: 3, else: x end)
[1, 3, 3, 4, 3, 34, 3]
您还可以使用模式匹配:

iex(1)> Enum.map(list, fn
...(1)> 2 -> 3
...(1)> x -> x
...(1)> end)

我们没有阵列,通过索引进行访问成本很高

如果你还想完成它,那就是你的朋友

替换_at=fn列表、索引、值-> 列表 |>使用_索引枚举 |>Enum.mapfn {{,^index}->值匹配索引 {value,}->value其他任何内容 终止 终止 像这样使用它

索引01 2 3 4 5 6 在[1,2,3,4,2,34,2]和[2,42]处更换_ ⇒ [1, 2, 42, 4, 2, 34, 2] 替换所有2与索引无关,不需要索引即可。只需使用Enum.map/2即可


此外,您应该了解Enum.each/2永远不会修改任何内容。

必须知道Elixir是不可变的,因此您不能替换列表中的值;实际上,您创建了一个新列表

您可以使用模块中的map方法,在模块中可以找到一系列算法来处理可枚举项

iex(2)> [1, 2, 3, 4, 2, 34, 2] |> Enum.map(fn
...(2)>   2 -> 3
...(2)>   other -> other
...(2)> end)
[1, 3, 3, 4, 3, 34, 3]
具有此实现的方法可能类似于以下代码:

defmodule Replace do

  def replace_all(list, from, to) do
    list
    |> Enum.map(fn
      ^from -> to
      other -> other
    end)
  end

end

您甚至可以在其中添加一行:Enum.maplist,fn 2->3;x->x结束,但不会太长,因为如果您使用它,格式化程序默认情况下会将其转换为多行。Re:replace\u at:List.replace\u at/3会立即执行相同的操作,而且效率更高,因为它应该能够重用列表的正确部分,并且不必遍历整个列表,但是它仍然很昂贵,并且不等同于一个数组。这个答案的主要目的是展示我们如何在需要时处理列表中的索引。Enum.reduce_while/3而不是Enum.map/2,我们将在/3实现中使用List.replace_。另外,将_放入/3+Access.at/2。