Clojure设置vs明显vs重复数据删除?

时间:2017-05-18 07:46:08

标签: clojure

因此,如果我们想要一组独特的项目,我们可以使用'set'。

如果我们已经有一些我们想要重复数据删除的项目集合,我们可以将它们传递给set函数,或者我们可以使用distinct或dedupe函数。

使用这些中的每一种情况(优点/缺点)是什么情况?

感谢。

1 个答案:

答案 0 :(得分:11)

区别在于:

  • set会热切地创建一个新的集合集。
  • distinct将创建一个延迟序列,其中删除了输入集合中的重复项。如果您处理大型集合,它具有优于集合的优势,而懒惰可能会使您无法热切地评估输入集合(例如,使用take
  • dedupe从输入集合中删除连续重复项,因此其语义与setdistinct不同。例如,当应用于(1 2 3 1 2 3)
  • 时,它会返回(1 1 1 2 3 3 1 1 2 2 2 3 3)

Set和lazy seq有不同的API可用(例如disjget vs nth)和性能特征(例如O(log32 n)查找set和O(n)对于懒惰的seq),应根据您希望如何使用其结果来选择它们。

另外distinctdedupe在没有参数的情况下调用时会返回一个传感器。