如何在满足条件时停止迭代序列

oct*_*bus 8 clojure

除了loop .. recur之外,使用什么是最好的Clojure构造,以便在遍历序列序列(sos)时,如果找到结果,处理可以停止?

以下是详细信息:

我有一个懒惰的序列从clojure-csv,一个sos返回.

在sos中的每个序列中的给定位置(索引)处存在值.

我一直在每个序列中查看该位置,直到找到该值或达到sos的结尾.

如果找到该值,我想停止处理sos.

我唯一能想到的是使用for with和when来保留匹配,但序列处理不会停止,或者使用过滤器.

但是,我相信我可以使用更好的东西,但我会被困在那将是什么.

谢谢.

Art*_*ldt 8

我更喜欢吃这些任务的时间,如果键是固定的索引,则第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])
Run Code Online (Sandbox Code Playgroud)

然后,您可以在结果序列上映射处理函数.


Kyl*_*yle 5

这个怎么样?

(defn find-first [pred col]
  (first (filter pred col)))
Run Code Online (Sandbox Code Playgroud)

然后你可以这样做:

(find-first #(< % 5) coll)
Run Code Online (Sandbox Code Playgroud)

您应该能够创建一个与序列序列一起使用的谓词.

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
Run Code Online (Sandbox Code Playgroud)