【问题标题】:Looping elements in elixir based on JAVA基于 JAVA 的 Elixir 中的循环元素
【发布时间】:2019-02-13 12:02:33
【问题描述】:

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

在 java 中我会这样写:

    private mList ArrayList<> = new ArrayList(" "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" ")

    private String fun(String a) {
      for(int i = 0;i < mList.size;i++;) {
       if(mList.position(i) == a)
        return mList.position(i++) 
     }
    }

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

【问题讨论】:

  • 我不太懂 Java 但不应该是mList.position(++i)(或i + 1)吗?

标签: elixir


【解决方案1】:

我需要从参数中提供的元素旁边的列表中返回一个元素。

有很多方法可以做到这一点。首先,使用模式匹配的惯用解决方案:

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"

【讨论】:

  • 谢谢,它成功了。抱歉,由于缺乏声誉,我无法为您的答案投票。
  • @KristjanTampere 但您可以将答案标记为正确。按复选标记。
【解决方案2】:

我会选择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"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-03
    • 1970-01-01
    • 2014-02-08
    • 2017-03-21
    • 2020-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多