2017-02-09 3 views
0

У меня есть список адресов, и мне нужно исправить записи, некоторые из записей имеют номер дома в качестве диапазона, и мне нужно разбить его на несколько записей. Как бы я перечислил список и исправил/дублировал записи?Разделить элементы на несколько элементов в Elixir

defmodule EnumTesting do 

    def list_stuff() do 
    list = [ %{street: "street", nr: "2" }, %{street: "street", nr: "4" }, %{street: "street", nr: "6-10" } ] 
    list |> Enum.filter(&needs_fixing?(&1)) 
    end 

    defp needs_fixing?(item) do 
    String.contains?(item.nr, "-") 
    end 

end 

Ожидаемый результат:

[ %{street: "street", nr: "2" }, %{street: "street", nr: "4" }, %{street: "street", nr: "6" }, %{street: "street", nr: "8" }, %{street: "street", nr: "10" } ] 
+0

Почему ожидаемый результат не имеет nr '7' и' 9'? – Dogbert

+0

@Dogbert, потому что во многих странах уличные номера странны на одной стороне улицы и даже на другой. Эта сторона даже :) – mudasobwa

+0

@mudasobwa, тогда вопрос кажется неясным тогда. Что, если nr «8-11» (четный)? что, если это «7-10» (нечетно-четное)? – Dogbert

ответ

1

У вас есть need_fixing? штраф, поэтому все, что вам нужно сделать, это реализовать функцию фиксации.

def fixing_function(%{nr: range, street: street}) do 
    [a, b] = range |> String.split("-") |> Enum.map(&String.to_integer/1) 
    for value <- Range.new(a, b), do: %{street: street, nr: "#{value}"} 
end 

Это дает фиксированные адреса, и вы добавляете этот список в список допустимых записей.

Он возвращает записи для 6, 7, 8, 9 и 10. Чтобы использовать его только для четного или нечетного числа, вы можете применить там простую функцию фильтра, используйте :lists:seq или Stream.iterate.

0
def fix!(%{street: street, nr: nr}) do 
    case Regex.scan(~r|\d+|, nr, capture: :all_but_first) do 
    [nr] -> [%{street: street, nr: nr}] 
    [from, two] -> String.to_integer(from)..String.to_integer(to) 
        |> Enum.map(fn i -> %{street: street, nr: "#{i}"} end) 
    _ -> raise "Something went wrong: input is incorrect!" 
    end 
end 

def list_stuff() do 
    list = [%{street: "street", nr: "2" }, 
      %{street: "street", nr: "4" }, 
      %{street: "street", nr: "6-10" } ] 
    list |> Enum.flat_map(&fix!/1) 
end 

выше возвратит 5 записей для последнего элемента, 6 через 10, но, как вы заявили в комментариях, вы знаете о том, как иметь дело с этим.

+0

Мне нужна помощь при вставке записей, это та часть, с которой у меня проблемы. –

+0

ОК, я добавил код для добавления всего между 'from' и' to'. Логика выбора эвенов и/или коэффициентов зависит от вас. – mudasobwa