2012-01-01 11 views
2
に順番に

をオブジェクトの位置を見つける:私はこのように動作します機能したい、基本的にClojureの

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

あなたは 'keep-indexed'を使うことができます - http://stackoverflow.com/questions/8641305/how-do-i-find-the-index-of-an-element-that-同じ述語に一致する述語である – Gert

+0

と同じ質問を持つ別のもの:http://stackoverflow.com/questions/4830900/how-do-i-find-the-index-of-an-item-in- - ベクトル – Gert

+0

@ gertalotありがとう!それらのリンクは本当に私を助けました – wrongusername

答えて

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に含まれていない理由があります:それは非常に効率的ではない、とあなたは非常に稀に、コレクション内のインデックスを気にしない - あなたが行う場合は、通常、あなたを再考すべきですアルゴリズム。

関連する問題