sorting - 是否有一种标准方法可以以 'conventional' 的方式比较 Clojure 向量

标签 sorting vector clojure

Clojure 向量有一个不常见的属性,即当您比较它们时,首先考虑向量的长度,然后再考虑任何其他属性。例如 haskell

Prelude> [1, 3] > [1, 2, 3]
True

和 ruby

1.9.3p392 :003 > [1, 3] <=> [1, 2, 3]
 => 1 

但是在 Clojure 中:

user=> (compare [1, 3] [1, 2, 3])
-1

现在您可以自己实现“常规”比较:

(defn vector-compare [[value1 & rest1] [value2 & rest2]]
  (let [result (compare value1 value2)]
    (cond 
      (not (= result 0)) result
      (nil? value1) 0 ; value2 will be nil as well 
      :else (recur rest1 rest2))))

但我预计这种比较向量的方法非常常见,因此有一个标准方法可以实现这一点。有吗?

最佳答案

如果两个事物实现了接口(interface)java.lang.Comparable,则compare函数会比较它们。 Clojure 中的 Vector 实现了此接口(interface),如 this 所示。链接,基本上它首先检查长度。没有核心函数可以完成您想要的操作,因此您必须推出自己的函数。

我想提的另一件事是,haskell 版本基本上是比较列表(而不是向量),计算列表长度效率不高,这在比较列表时避免长度是有意义的,因为向量长度计算是 O(1 ) 操作,因此首先检查长度是有意义的。

关于sorting - 是否有一种标准方法可以以 'conventional' 的方式比较 Clojure 向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15716894/

相关文章:

python - 在元组数组中搜索值非常慢

r - 如何检查给定值是否属于列表中的向量?

c++ - 如何访问由 std::vector 分配的内存块?

clojure - 如何绑定(bind)动态变量?

javascript - 如何使用 Javascript 对表格行进行排序

javascript - 在 Node.JS 中排序数据

c++ - Vector Object Inventory,可以存储其他对象类型的对象?

macros - 在 Clojure 语言中 <'a> 到底是什么

clojure - 从不同的命名空间运行嵌入代码

java 二维数组 - 排序和搜索