2013-12-10 82 views
1

以下工作適用於小列表(< 500),但它會針對較大的列表(> 2500)不確定地掛起。有沒有更好的方法來實現這種效果而不失敗?在Clojure中優化合並

(def errors '({:a-key 
    ["some string"]} 
    {:a-key 
    ["some string"]} 
    {:a-key 
    ["some string"]} 
    {:a-key 
    ["some other string"]})) 

(def unique-errors (apply merge-with (comp distinct into) errors)) 

;; => {:a-key ("some string", "some other string")} 

回答

5

與您的代碼的主要問題,我想,是不是它的速度慢,那就是它導致堆棧溢出,因爲distinct爲每個新的錯誤調用一次,並在打印時,它的懶惰,所以結果,有很多「嵌套的」調用distinct

但無論如何:使用套不應包含重複的東西。使用集會導致以下情況,速度稍快並且不會導致堆棧溢出。

(def errors (repeat 5000 {:a-key #{"some string"}})) 
(apply merge-with into errors) 
+0

用原始數據結構'(應用merge-with into(set errors))'。 –

+0

@ A.Webb只有只有一個密鑰或副本才能進行(dupliacte地圖vs重複條目)。 – cgrand

+0

我假設後者,但你是對的,這不會與OP解決方案相同。 –