我怎样才能在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)))
但这似乎不必要地复杂。在我看来,好像我错过了一个基本功能。
答案 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