将java.util.HashSet转换为Clojure集的最佳方法

将java.util.HashSet转换为Clojure集的最佳方法,clojure,casting,datomic,Clojure,Casting,Datomic,出于兼容性目的,Datomic查询返回java.util.HashSet。我想在查询结果集上使用clojure.set函数,如set difference。目前,我正在使用(set datomic\u result)将结果集转换为Clojure集。有没有替代方法?我建议您不要依赖返回值是java.util.Set,这是一个实现细节(根据Datomic,返回类型是java.util.Collection) 通过将set操作直接应用于返回的集合,而不是强制应用于集合,可以获得更好的性能。例如: ;;

出于兼容性目的,Datomic查询返回
java.util.HashSet
。我想在查询结果集上使用
clojure.set
函数,如set difference。目前,我正在使用
(set datomic\u result)
将结果集转换为Clojure集。有没有替代方法?

我建议您不要依赖返回值是
java.util.Set
,这是一个实现细节(根据Datomic,返回类型是
java.util.Collection

通过将set操作直接应用于返回的集合,而不是强制应用于集合,可以获得更好的性能。例如:

;; set difference
(into #{} (remove to-remove) query-result)
;; set intersection
(into #{} (filter to-keep) query-result)
;; set union
(into my-set query-result)

通过使用,您可以同时利用和,这可以在大输入时显著提高性能。

使用
(设置datomic_结果)
方法有什么问题?这正适合我。结果集可能很大,我相信这会带来开销。是否需要对结果集执行多个操作以保持不变性?如果没有,并且您不介意修改返回的
HashSet
s,那么最好使用java的
Set
操作(
removeAll
用于
difference
addAll
用于union等)。对于两个10e6元素
HashSet
s,结果差为5e6,使用
clojure.set/difference
计算差需要6秒,使用java的
removeAll
@Josh大约需要1秒,这只是一个答案。我不认为我需要不变性。Java函数处理元组集是否与Clojure元组集一样有效,即在元组元素上使用
=
?您不需要一个集合来提高删除效率吗?如果右边的集合很小,它确实比整个扫描要快。我指的是
O(n^2)
O(n)
使用集合与使用集合的性能。但是你是对的,我应该考虑到其中一个可能很小,没有一个例子有O(nm)的复杂性——只有O(n)。我之前的评论承认,通过使用返回结果是一个集合这一事实,您可以得到O(m)。您能告诉我,它是如何神奇地知道
查询结果
中包含的项不在要删除的集合
中的吗?