2013-03-05 17 views

答えて

7

Clojureは簡単に組み込みの方法を提供しますJava Interop

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

ありがとうございます。これは私が最後に使用するものですが、私は通常、Java Interopを「ビジネス」コードから明示的に呼び出すことを避けようとしています。少し冗長であるとわかります。それにもかかわらずありがとう。 –

+0

これはうまくいくかもしれませんが、コレクションはシーケンスではないことに注意してください。 – NielsK

+0

@NielsK哲学的な概念は別として、 'java.util.List'が' seq'のスーパークラスであり、javaメソッドが 'java.util.List'のペアであると思います。このように、遅延のあるシーケンス(これを無限に評価しないように注意してください) '(java.util.Collections/indexOfSubList(range 10)(range 3 7)); => 3'、vectors、sorted-地図など –

3

シーケンスは抽象であり、concretionではありません。シーケンス抽象化で使用できる特定のコンセプトには、サブシーケンス(文字列やJavaコレクションなど)の位置を見つける方法がありますが、一般的なシーケンスはありません。基本的なconcretionはインデックスを持つ必要がないためです。

しかし、できることは、要素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) 

一般に、インデックスベースのアルゴリズムは機能的な言語ではないことに注意してください。最終結果にインデックスが必要な理由がない限り、インデックスルックアップの贅沢な使用はコードの匂いとみなされます。

関連する問題