2017-02-09 40 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:seqStream.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'之間添加所有內容的代碼。選擇evens和/或賠率的邏輯取決於你。 – mudasobwa