除了loop .. recur之外,使用什么是最好的Clojure构造,以便在遍历序列序列(sos)时,如果找到结果,处理可以停止?
以下是详细信息:
我有一个懒惰的序列从clojure-csv返回,一个sos。
sos中每个序列中的给定位置(索引)都有一个值。
我一直在查看每个序列中的位置,直到找到值或 到了sos的结尾。
如果找到该值,我想停止处理sos。
我唯一能想到的是使用for with和when来保留匹配,但序列处理不会停止,或使用过滤器。
然而,我相信我可以使用更好的东西,但我会被困在那将是什么。
感谢。
答案 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)
“