2013-03-05 17 views

risposta

7

Clojure fornisce un modo integrato per un facile Java Interop.

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

Grazie per la risposta. Questo è quello che userò alla fine, ma di solito cerco di evitare di chiamare esplicitamente Java Interop dal codice 'business', perché trovo che sia un po 'prolisso. Grazie comunque. –

+0

Anche se può funzionare, tenere presente che una raccolta non è una sequenza. – NielsK

+0

@NielsK Nozioni filosofiche a parte, penso che troverai 'java.util.List' come una superclasse di un' seq' e che il metodo java sia sulla coppia di 'java.util.List's. Come tale, potresti usare questo su sequenze pigri (fai attenzione a non valutarne uno infinito) '(java.util.Collections/indexOfSubList (range 10) (range 3 7)); => 3', vettori, ordinati- mappe, ecc. –

3

Una sequenza è un'astrazione, non una concrezione. Certe concrezioni che puoi usare attraverso l'astrazione della sequenza hanno un modo per trovare la posizione di una sottosequenza (stringhe e raccolte java, per esempio), ma le sequenze in generale no, perché la concrezione alla base non deve avere un indice .

Ciò che si può fare, tuttavia, è creare un juxt dell'identità dell'elemento e una funzione di indice. Dai un'occhiata a map-indexed.

Ecco un'implementazione ingenua che troverà pigramente la posizione di (tutte) le sottosequenze in una sequenza. Basta usare prima o fare 1 per trovare una sola:

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

fare in modo che gli algoritmi basati su indici in genere non sono qualcosa che si dovrebbe fare in un linguaggio funzionale. A meno che non ci siano buoni motivi per cui è necessario l'indice nel risultato finale, l'uso generoso della ricerca dell'indice è considerato odore di codice.

Problemi correlati