如何验证列表是否已排序?

时间:2014-02-03 22:42:03

标签: list clojure sorted

我怎样才能在Clojure中验证数字列表是否已排序?

(def my-list (list 1 2 3 1 4 2 2 4))
如果集合实现sorted?接口,

sorted仅返回true。我正在寻找一个reduce操作,它会成对迭代列表,例如(reduce < my-list)。 我知道我可以手动创建对并比较这些:

(letfn [(pair [l] (if (= (count l) 2) (list l) (cons (take 2 l) (pair (rest l)))))]
    (every? #(apply < %) (pair my-list)))

但这似乎不必要地复杂。在我看来,好像我错过了一个基本功能。

3 个答案:

答案 0 :(得分:22)

最简单的解决方案:

(apply <= mylist)

>=也适用于反向排序

答案 1 :(得分:4)

我会对重叠的数字对进行一次传递并检查它们是<=(正如你所提到的),因为它是O(n),尽管你不需要手动进行配对。

user> (partition-all 2 1 [1 2 3 4 5 6])
((1 2) (2 3) (3 4) (4 5) (5 6) (6))

user> (every? #(apply <= %) (partition-all 2 1 [1 2 3 4 6 5]))
false

user> (every? #(apply <= %) (partition-all 2 1 [1 2 3 4 5 6]))
true  

答案 2 :(得分:1)

您可以对列表进行排序并将其与原始列表进行比较:

(= my-list (sort my-list))

示例:

> (def my-list (list 1 2 3 1 4 2 2 4))
#'sandbox3825/my-list

> (= my-list (sort my-list))
false

> (def my-list (list 1 2 3 4))
#'sandbox3825/my-list

> (= my-list (sort my-list))
true