2017-06-22 9 views
0

私はマップと二つのリストを持っている:エリクシール/フェニックス出口ループ

apps = [%{name: "app1", version: "0.0.1"}, %{name: "app2", version: "0.0.1"}] 
updates_list = [%{name: "app1", version: "0.0.2"}, 
       %{name: "app2", version: "0.0.1"}, 
       %{name: "app3", version: "0.0.1"}, 
       %{name: "app4", version: "0.0.1"}] 

や更新があるかどうかを示すためにappsリストの各要素に新しいキーを置くために、updates_listを列挙する必要があります。

updates_map = Enum.map(updates_list, fn (x) -> Map.put(%{}, x.name, x.version) end) 
result = Enum.map(apps, fn (x) -> map_updates(x, updates_map) end) 

と機能::私は、次の機能を試してみました

result = [%{name: "app1", version: "0.0.1", new_version: true}, 
      %{name: "app2", version: "0.0.1", new_version: false}] 

defp map_updates(app, updates_map) do 
    app_map = Map.from_struct(app) 
    for update <- updates_map do 
    if Map.has_key?(update, app_map.name) do 
     if Map.fetch(update, app_map.name) != app_map.version do 
     app_map = app_map |> Map.put(:new_version, true) 
     else 
     app_map = app_map |> Map.put(:new_version, false) 
     end 
    else 
     app_map = app_map 
    end 
    end 
    app_map 
end 
すなわちここで app1のための新たなバージョンがある、私は new_version: true/falseを追加して、目的の結果を取得する必要があります

しかし、すべてのアプリケーションですべてupdates_mapを列挙しているので、それを上書きするだけで結果は得られません。ループを終了する方法、または上記のようにresultを達成するために変更を保存する方法はありますか?どんなアドバイスもありがとう!

答えて

2

O(n*m)解決策が受け入れられ、新しいバージョンが存在するという基準が同じ名前で異なるバージョンが存在する場合は、update_mapのコードを書く必要はありません(これはあなたのコードですそうです)。これはほんの一forと1ネストされたEnum.any?で行うことができます。

apps = [%{name: "app1", version: "0.0.1"}, %{name: "app2", version: "0.0.1"}] 
updates_map = [%{name: "app1", version: "0.0.2"}, 
       %{name: "app2", version: "0.0.1"}, 
       %{name: "app4", version: "0.0.1"}, 
       %{name: "app4", version: "0.0.1"}] 

updated_apps = for app <- apps do 
    new_version = Enum.any?(updates_map, fn update -> 
    app.name == update.name && app.version != update.version 
    end) 
    Map.put(app, :new_version, new_version) 
end 

IO.inspect updated_apps 

は出力:

[%{name: "app1", new_version: true, version: "0.0.1"}, 
%{name: "app2", new_version: false, version: "0.0.1"}] 

あなたがアプリケーションや多数の更新で実行するためにこれを必要とした場合、あなたはおそらく更新を変換する必要があります内部ロジックがより高速に実行されるように、ある種のMapに変換します。

+0

ちょっと@Dogbert私はあなたのソリューションを試して、それは動作します!ありがとうございました!私はEnum.anyからブール値を使うことを考慮しませんでしたか?今はずっと簡単です!良い一日を! – Ilya