Петельные элементы в эликсире на основе JAVA - PullRequest
0 голосов
/ 08 сентября 2018

Добрый день, мне трудно понять, как перечислить элементы в эликсире. Итак, у меня есть String List из elements в эликсире. У меня есть функция с предоставленным аргументом (argument is element in the List). Мне нужно вернуть element из List, то есть next , в элемент, указанный в аргументе.

В 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? Я знаю, как перечислить список, но не понимаю, как вернуть элемент позиции ++.

Ответы [ 2 ]

0 голосов
/ 08 сентября 2018

Я бы пошел с 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"
0 голосов
/ 08 сентября 2018

Мне нужно вернуть элемент из списка, который находится рядом с элементом, указанным в аргументе.

Есть много способов сделать это. Во-первых, идиоматическое решение, использующее сопоставление с образцом:

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"
...