9

loop .. recur以外に、シーケンス(sos)のシーケンスをトラバースしているときに、結果が見つかった場合に処理を停止できるようにするために使用するのに最適なClojureコンストラクトは何ですか?

詳細は次のとおりです。

sosであるclojure-csvからレイジーシーケンスが返されました。

sos内の各シーケンスの特定の位置(インデックス)に値があります。

値が見つかるか、sosの終わりに達するまで、各シーケンスでその位置を調べ続けます。

値が見つかったら、sosの処理を停止します。

私が考えることができる唯一のことは、一致を保持するためにfor with whenとintoを使用することですが、シーケンス処理は停止しないか、フィルターを使用します。

しかし、私はもっと良いものを使うことができると信じていますが、それがどうなるかについては行き詰まっています。

ありがとう。

4

5 に答える 5

9

私はそのようなタスクには時間がかかることを好み、キーが固定インデックスにある場合はn番目がそれに一致する可能性があります。

(take-while #(not= (nth % index) key) sos)

user> (def sos [[1 2 3] [4 5 6] [7 8 9] [10 11 12]])
#'user/sos
user> (take-while #(not= (nth %  2) 9) sos)
([1 2 3] [4 5 6])

次に、結果のシーケンスに処理関数をマッピングできます。

于 2012-08-08T15:10:46.437 に答える
5

これはどう?

(defn find-first [pred col]
  (first (filter pred col)))

次に、例としてこれを行うことができます。

(find-first #(< % 5) coll)

シーケンスのシーケンスで機能する述語を作成できるはずです。

user=> (defn find-first [pred col]
  (first (filter pred col)))
#'user/find-first
user=> (find-first #(> % 10) '(1 5 8 2 15 20 31 5 1))
15
于 2012-08-08T14:26:22.907 に答える
4

forwith:whileは次のように使用できます。

(for [s sos :while (not (= (nth s index) val))]  
     s) ;;or do something with s
于 2012-08-08T15:58:35.987 に答える
1

最初の出現を検索するときは、を使用しますdrop-while。確かに、filter有用ではないシーケンス全体を処理します。(そして、無限のシーケンスを使用したい場合はどうなりますか?)

編集:これを考慮に入れないでください。確かにfilter、怠惰なシーケンスを返します。

(defn find-first
  [pred coll]
  (first (drop-while #(not (pred %)) coll))
于 2012-08-08T14:49:00.503 に答える
1

someはこの目的のために法案にうまく適合していると思います。

(pred x)" for any xin 、else nilの最初の論理的な真の値を返しますcoll。一般的なイディオムの1つは、セットをpredとして使用することです。たとえば、がシーケンス内にある :fred場合はこれが返され、そうでない場合はnilが返されます。 ":fred(some #{:fred} coll)

于 2015-06-10T23:51:15.160 に答える