Clojure fornisce un modo incorporato per trovare la posizione di una sottodirectory in una determinata sequenza?Posizione sottocategione Clojure in sequenza
risposta
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
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.
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. –
Anche se può funzionare, tenere presente che una raccolta non è una sequenza. – NielsK
@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. –