以下适用于小型列表(< 500),但对于较大的列表(> 2500),它会无效地挂起。有没有更好的方法来实现这种效果而不失败?
(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")}
答案 0 :(得分:5)
我认为你的代码的主要问题并不是它很慢,而是导致堆栈溢出,因为每个新错误都会调用distinct
一次,而且它很懒,所以在打印时结果,有很多“嵌套”distinct
电话。
但无论如何:对不应包含重复项的内容使用集合。使用集合会导致以下情况,这会更快一点,并且不会导致堆栈溢出。
(def errors (repeat 5000 {:a-key #{"some string"}}))
(apply merge-with into errors)