美好的一天,我很难弄清楚如何枚举长生不老药中的元素。所以我在Elixir中有String List
的{{1}}。我有一个带有提供的参数(elements
)的函数。我需要从参数argument is element in the List
返回的element
,该变量下一个到参数中提供的元素。
在Java中,我会这样写:
List
我如何在Elixir中实现相同的功能?我知道如何枚举列表,但我不知道如何返回position ++的元素。
答案 0 :(得分:2)
我需要从列表中返回参数中提供的元素旁边的元素。
有很多方法可以做到这一点。首先,使用模式匹配的惯用解决方案:
def first([a, b | _], a), do: b
def first([_, b | c], d), do: first([b | c], d)
def first([]), do: nil
这将递归检查第一个元素是否与参数匹配,如果匹配则返回下一个。
这是您算法的更直接翻译:
def second(list, x) do
case Enum.find_index(list, &(&1 == x)) do
nil -> nil
i -> Enum.at(list, i + 1)
end
end
测试:
list = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]
IO.inspect A.first(list, "d")
IO.inspect A.second(list, "d")
输出:
"e"
"e"
答案 1 :(得分:1)
我会选择Enum.drop_while/2
:
list =
97..122
|> Enum.to_list()
|> List.to_string()
|> String.split(~r//, trim: true)
case Enum.drop_while(list, & &1 != "d") do
["d", result | _] -> result
_ -> nil
end
#⇒ "e"
甚至是幻想中的枚举的大锤:Enum.reduce_while/3
:
Enum.reduce_while(list, false, fn
x, false -> {:cont, x == "d"}
x, true -> {:halt, x}
_, _ -> {:cont, false}
end)
#⇒ "e"