Clojure中是否提供任何内置方式来查找给定序列中子序列的位置?
Clojure提供了一种内置的简便方式,可轻松进行Java交互。
(java.util.Collections/indexOfSubList '(a b c 5 6 :foo g h) '(5 6 :foo))
;=> 3
(defn find-pos
[sq sub]
(->>
(partition (count sub) 1 sq)
(map-indexed vector)
(filter #(= (second %) sub))
(map first)))
=> (find-pos [:a :b \c 5 6 :foo \g :h]
[\c 5 6 :foo])
(2)
=> (find-pos "the quick brown fox"
(seq "quick"))
(4)
请注意,在函数式编程语言中通常不会使用基于索引的算法。除非在最终结果中需要索引有很好的理由,否则过度使用索引查找被认为是代码异味。
java.util.List
是seq
的超类,并且该Java方法与java.util.List
成对出现。因此,您可以在惰性序列上使用它(只需小心不要评估无限序列)(java.util.Collections/indexOfSubList (range 10) (range 3 7)) ;=> 3
,向量,排序映射等。 - A. Webb