基于JAVA的长生不老药中的循环元素

时间:2018-09-08 10:19:20

标签: elixir

美好的一天,我很难弄清楚如何枚举长生不老药中的元素。所以我在Elixir中有String List的{​​{1}}。我有一个带有提供的参数(elements)的函数。我需要从参数argument is element in the List返回的element,该变量下一个到参数中提供的元素。

在Java中,我会这样写:

List

我如何在Elixir中实现相同的功能?我知道如何枚举列表,但我不知道如何返回position ++的元素。

2 个答案:

答案 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"