6

Clojureは、特定のシーケンス内のサブシーケンスの位置を見つけるための組み込みの方法を提供しますか?

4

2 に答える 2

7

Clojureは、 Java相互運用を簡単にするための組み込みの方法を提供します。

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

シーケンスは抽象化であり、具体的なものではありません。シーケンスの抽象化を通じて使用できる特定のコンクリーションには、サブシーケンスの位置を見つける方法があります(たとえば、文字列やJavaコレクション)が、基になるコンクリーションにインデックスが必要ないため、シーケンスには一般にありません。 。

ただし、できることは、要素IDとインデックス関数のjuxtを作成することです。map-indexedをご覧ください。

これは、シーケンス内の(すべての)サブシーケンスの位置を遅延的に見つける単純な実装です。最初に使用するか、1を使用して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 に答える