2017-02-09 6 views
0

住所のリストがあり、レコードを修正する必要があります。レコードの一部に範囲としてハウスナンバーがあり、複数のレコードに分割する必要があります。どのようにリストを列挙し、レコードを修正/複製するのですか?エリクシールのアイテムを複数のアイテムに分割する

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?ですので、固定機能を実装するだけです。

これはあなたに固定アドレスを与え、このリストを有効なエントリのリストに追加します。

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つのレコード、106を返しますが、あなたがコメントで述べたように、あなたが対処する方法については認識していますそれと。

+0

私はレコードを挿入するのに助けが必要です、それは私が問題を抱えている部分です。 –

+0

OK、 'from'と' to'の間にすべてを追加するコードを追加しました。エヴェンスやオッズの選択のロジックはあなた次第です。 – mudasobwa

関連する問題