2017-06-19 3 views
0

Ich versuche, zwei verschiedene Karten zu vergleichen. Die erste ist eine Konstante in meinem Modul:Vergleichen Sie Schlüssel aus zwei verschiedenen Karten. Elixir

@list_items %{apples: 2, orange: 1, banana: 3} 

Dieser fungiert als key: Artikelname, value: Artikelpreis.

Dann sieht meine Funktion wie folgt aus:

def purchase(items) do 
    items 
    |> Map.merge(@list_items) 
end 

Im Grunde, was ich tun möchte, ist dies. Wenn der in der Funktion übergebene Wert items mit einem der Schlüssel übereinstimmt, wird eine modifizierte Zuordnung zurückgegeben, die nur die übereinstimmende Zuordnung enthält, und die Werte werden miteinander multipliziert. Dies sollte den Gesamtpreis basierend auf dem, was in der Konstante definiert ist, zurückgeben. Hier ist ein Test zu klären:

test "#purchase/1" do 
    assert ProblemModule.purchase(%{apples: 4}) == 8 
end 

Ich versuche Elixir zu verstehen. Und dieses konstruierte Problem wird mir hoffentlich helfen.

Antwort

1

ich for verwenden würde den Preis der einzelnen Elemente zu berechnen, und dann Summe Enum.sum/1 mit:

Enum.sum(for {name, quantity} <- items, do: list_items[name] * quantity) 
iex(1)> list_items = %{apples: 2, orange: 1, banana: 3} 
%{apples: 2, banana: 3, orange: 1} 
iex(2)> items = %{apples: 4} 
%{apples: 4} 
iex(3)> Enum.sum(for {name, quantity} <- items, do: list_items[name] * quantity) 
8 
iex(4)> items = %{apples: 4, orange: 9} 
%{apples: 4, orange: 9} 
iex(5)> Enum.sum(for {name, quantity} <- items, do: list_items[name] * quantity) 
17 
+0

Wow verwenden könnte, der ist perfekt. Ich habe gerade auch Listen-Listen gelesen! – Bitwise

2

Sie eine Falte

list_items = %{apples: 2, orange: 1, banana: 3} 

purchases = %{apples: 4, orange: 10} 

purchases 
|> Enum.to_list() 
|> List.foldl(0, fn {key, value}, acc -> 
    list_items[key] * value + acc 
end) 
Verwandte Themen