按顺序排列Clojure子序列

时间:2013-03-05 12:33:44

标签: clojure sequences

Clojure是否提供任何内置方法来查找给定序列中子序列的位置?

2 个答案:

答案 0 :(得分:7)

Clojure为轻松Java Interop提供了一种内置方式。

(java.util.Collections/indexOfSubList '(a b c 5 6 :foo g h) '(5 6 :foo))
;=> 3

答案 1 :(得分:3)

序列是抽象,而不是凝固。您可以通过序列抽象使用的某些具体结构有一种方法可以找到子序列的位置(例如字符串和java集合),但序列通常不会,因为底层的具体结构不必具有索引

然而,您可以创建元素标识的juxt和索引函数。看看map-indexed

这是一个天真的实现,它会懒洋洋地找到序列中(所有)子序列的位置。只需先使用或使用1只找到一个:

(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)

注意基于索引的算法通常不是您在函数式语言中要做的事情。除非有充分的理由在最终结果中需要索引,否则大量使用索引查找会被视为代码味道。