2017-01-23 34 views
1

我有一組的HashMap的(或一個HashSet,包含HashMap數組)象下面這樣:如何將數據添加到Clojure中的哈希集?

(def mydata #{{:rank 2 :page 1 :group "fish"} 
       {:rank 1 :page 1 :group "mammal"} 
       {:rank 3 :page 2 :group "bird"}}) 

,我有一個新的HashMap是這樣的:

{:group "mammal" :name "lion" :score 566} 

我想基本上做什麼是新的HashMap的數據排序合併到上述陣列,所以它看起來像這樣(「組」是連接鍵):

#{{:rank 2 :page 1 :group "fish"} 
    {:rank 1 :page 1 :group "mammal" :name "lion" :score 566} 
    {:rank 3 :page 2 :group "bird"}} 

我的想法是先找到在索引數組是1(基於零),然後使用與給定的新散列映射相關聯的函數,因此'group'被忽略或保持不變,'name'和'score'被添加。

首先,我需要找到一種方法來獲取該索引,但這是我現在卡住的地方。

有沒有簡單和容易的方法來做到這一點?完成的數據將被轉換爲json。我不確定是否建立一個像這樣的hashmaps數組是一種在Clojure中創建一些json數據的正確方法。至少,將一組hashmaps傳遞給json庫現在可以生成一個數組,以json格式提供數據集,但請提供一些建議,如果我以錯誤的方式行事。)

+0

您的數據結構只允許每組中的一隻動物。是這樣嗎? – Thumbnail

+0

是的,就是這樣。它就像RDB模式中的1:1連接鍵。 – gini09

回答

2

首先哈希集不給你任何的利潤在這個用例(任何順序都行,任何序列將被轉換成JSON數組,根據我瞭解Clojure中的JSON庫)

但是您所描述的操作類型相當頻繁,並且/或者集合可能很大,每次遍歷整個集合都會非常昂貴。我會重新格式化您的數據,按組索引的地圖:

(def mydata {"fish" {:rank 2 :page 1 :group "fish"} 
      "mammal" {:rank 1 :page 1 :group "mammal"} 
      "bird" {:rank 3 :page 2 :group "bird"}}) 

,然後更新它是這樣的:

(defn update-animal [animal data] 
    (update data (:group animal) merge animal)) 


user> (update-animal {:group "mammal" :name "lion" :score 566} mydata) 
;;{"fish" {:rank 2, :page 1, :group "fish"}, 
;; "mammal" {:rank 1, :page 1, :group "mammal", :name "lion", :score 566}, 
;; "bird" {:rank 3, :page 2, :group "bird"}} 

,當你需要將其轉換爲JSON,你只需要值序列: (to-json (vals data))

0

集合沒有索引。你可以迭代它的所有元素,如果任何一個匹配新的hashmap,那麼用一個合併的hasmap(現有的元素和新的元素)替換它。最後將結果轉換爲一個集合。

(defn update-set 
    [baseset elem] 
    (set (map #(if (= (:group elem) (:group %)) 
       (merge elem %) 
       %1) 
      baseset))) 


(def mydata #{{:rank 2 :page 1 :group "fish"} 
      {:rank 1 :page 1 :group "mammal"} 
      {:rank 3 :page 2 :group "bird"}}) 

(update-set mydata {:group "mammal" :name "lion" :score 566}) 
相關問題