【问题标题】:How to replace elements in an array in elixir如何在 Elixir 中替换数组中的元素
【发布时间】:2021-03-19 03:51:05
【问题描述】:

我想用 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


    【解决方案1】:

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

    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)
    

    【讨论】:

    • 你甚至可以单行:Enum.map(list, fn 2 -> 3; x -> x end)(但时间不长,如果你使用格式化程序,默认情况下会将其转换为多行)。
    【解决方案2】:

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

    你可以使用Enum模块中的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
    

    【讨论】:

      【解决方案3】:

      我们没有数组,按索引访问成本很高。

      如果你还想完成它,Enum.with_index/2 是你的朋友。

      replace_at = fn list, index, value -> 
        list
        |> Enum.with_index()
        |> Enum.map(fn
          {_, ^index} -> value # match index
          {value, _} -> value  # anything else   
        end)
      end
      

      并像使用它

      # index      0  1  2  3  4  5   6  
      replace_at.([1, 2, 3, 4, 2, 34, 2], 2, 42)
      #⇒ [1, 2, 42, 4, 2, 34, 2]
      

      全部替换2与索引无关,不需要索引即可。开箱即可使用Enum.map/2


      另外,您应该知道Enum.each/2 不会修改任何内容。

      【讨论】:

      • Re: replace_at: List.replace_at/3 我相信会开箱即用并且效率更高,因为它应该能够重用列表的正确部分并且不必走完整列表(但它仍然很昂贵且不等同于数组)。
      • 这个答案的目的主要是展示我们如何在需要时处理列表中的索引。 Enum.reduce_while/3 而不是 Enum.map/2,我们将使用 List.replace_at/3 实现。另外,put_in/3 + Access.at/2
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-14
      • 2013-07-04
      • 2014-12-17
      • 1970-01-01
      • 1970-01-01
      • 2010-09-24
      • 2017-07-22
      相关资源
      最近更新 更多