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

时间:2012-08-08 14:15:40

标签: clojure

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

以下是详细信息:

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

sos中每个序列中的给定位置(索引)都有一个值。

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

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

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

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

感谢。

5 个答案:

答案 0 :(得分: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])

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

答案 1 :(得分: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

答案 2 :(得分:4)

带有for

:while可以像:

一样使用
(for [s sos :while (not (= (nth s index) val))]  
     s) ;;or do something with s

答案 3 :(得分:1)

在搜索第一次出现时,我会使用drop-while。实际上,filter将处理无用的整个序列。 (如果你想使用无限序列怎么办?)

编辑:请勿考虑这一点。实际上,filter返回一个懒惰的序列。

(defn find-first
  [pred coll]
  (first (drop-while #(not (pred %)) coll))

答案 4 :(得分:1)

我认为some很适合这个目的。

  

“为(pred x)中的任何x返回coll的第一个逻辑真值,     别的没有。例如,一种常见的习惯是使用集合作为pred     如果:fred在序列中,则返回:fred,否则为零:     (some #{:fred} coll)