6

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

4

2 回答 2

7

Clojure 为简单的Java Interop提供了一种内置方式。

(java.util.Collections/indexOfSubList '(a b c 5 6 :foo g h) '(5 6 :foo))
;=> 3
于 2013-03-05T13:05:33.343 回答
4

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

但是,您可以做的是创建元素标识和索引函数的并列。看看map-indexed

这是一个简单的实现,它将懒惰地找到序列中(所有)子序列的位置。只需使用 first 或取 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)

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

于 2013-03-05T13:21:00.350 回答