2015-04-27 33 views
1

我一直在尋找clojure一段時間,但我找不到一個函數,它會爲嵌套地圖提供一個默認值。例如,如果我有一個圖如下,clojure中的嵌套地圖的默認值

(def paths {:A {:B 5, :D 5, :E 7}, 
      :B {:C 4}, 
      :C {:D 8, :E 2}, 
      :D {:C 8, :E 6}, 
      :E {:B 3} 
      }) 

我想創建一個地圖如下,從給定的哈希映射功能,

{:A {:B 5, :C default_val :D 5, :E 7}, 
      :B {:A default_val, :C 4, :D default_val, :E default_val}, 
      :C {:A default_val, :B default_val, :C default_val, :D 8, :E 2}, 
      :D {:A default_val, :B default_val, :C 8, :D default_val, :E 6}, 
      :E {:A default_val, :B 3, :C 8, :D default_val, :E 3} 
      } 

回答

2

讀取你的榜樣,很難說確切地說,當你想要包含默認值的時候,雖然有一種非常常見的模式,即提供一組默認值並將輸入合併到它中,以便在給定值的地方使用它,並且如果不存在特定的鍵,默認值是使用:

user> (def default-values {:A :default :B :default :C :default :D :default}) 
#'user/default-values 

user> (def paths {:A {:B 5, :D 5, :E 7}, 
      :B {:C 4}, 
      :C {:D 8, :E 2}, 
      :D {:C 8, :E 6}, 
      :E {:B 3}}) 
#'user/paths 

user> (keys paths) 
(:A :D :B :C :E) 

user> (vals paths) 
({:D 5, :B 5, :E 7} {:C 8, :E 6} {:C 4} {:D 8, :E 2} {:B 3}) 

user> (map #(merge default-values %) (vals paths)) 
({:A :default, :D 5, :B 5, :C :default, :E 7} 
{:A :default, :D :default, :B :default, :C 8, :E 6} 
{:A :default, :D :default, :B :default, :C 4} 
{:A :default, :D 8, :B :default, :C :default, :E 2} 
{:A :default, :D :default, :B 3, :C :default}) 

user> (clojure.pprint/pprint 
     (zipmap (keys paths) 
       (map #(merge default-values %) 
        (vals paths)))) 
{:E {:A :default, :D :default, :B 3, :C :default}, 
:C {:A :default, :D 8, :B :default, :C :default, :E 2}, 
:B {:A :default, :D :default, :B :default, :C 4}, 
:D {:A :default, :D :default, :B :default, :C 8, :E 6}, 
:A {:A :default, :D 5, :B 5, :C :default, :E 7}} 
+0

是的,這就是我所尋找的。謝謝 :) –