在Clojure中查找序列中对象的位置

时间:2012-01-01 04:11:44

标签: clojure clojure-1.3

基本上,我想要一个像这样工作的函数:

user=> (pos 'c '(a b c d e f g) =)
2
user=> (pos 'z '(a b c d e f g) =)
nil

我想出了这个:

(defn pos
  "Gets position of first object in a sequence that satisfies match"
  [object sequence match]
  (loop [aseq sequence position 0]
    (cond (match object (first aseq)) position
          (empty? aseq) nil
          :else (recur (rest aseq) (inc position)))))

所以我的问题是,是否有一些内置函数可以让我们这样做,或者是否有更好的,更实用的/ Clojure-ish方式来编写pos函数?

1 个答案:

答案 0 :(得分:5)

好吧,如果您真的想要查找特定项目,可以在集合上使用.indexOf;如果你想用谓词做更通用的事情你不需要函数一个项目,那么只需要一个函数。

(defn pos [pred coll]
  (->> coll
       (map-indexed #(when (pred %2) %1))
       (remove nil?)
       (first)))

user> (pos #{'c} '(a b c d e f g))
2

另一方面,有一个原因不包含在clojure.core中:它不是很有效,你很少关心集合中的索引 - 如果你这样做,你通常应该重新考虑你的算法。