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.
- 1. lunghezza Clojure sequenza
- 2. Concatenazione pigra della sequenza in Clojure
- 3. Ottieni elemento da sequenza in clojure
- 4. Enumerare su una sequenza in Clojure?
- 5. Clojure numeri primi di sequenza pigro
- 6. Come ottenere le code di sequenza clojure
- 7. Aggiungere elementi in una lista/sequenza in Clojure
- 8. Come convertire una sequenza in un byte [] in Clojure?
- 9. In clojure, come costruire la sequenza pigro usando algoritmo iterativo
- 10. Come posso rimuovere un elemento da una sequenza in Clojure?
- 11. Domanda di clojure idiomatica sulla trasformazione in sequenza
- 12. Crea una classe Java come sequenza in Clojure
- 13. Come creare una sequenza lenta di numeri casuali in clojure
- 14. Convertire una sequenza di stringhe in numeri interi (Clojure)
- 15. Come valutare una sequenza di funzioni impure in Clojure?
- 16. Iterator blocks in Clojure?
- 17. Clojure Rimuovi elementi dal vettore in una posizione specificata
- 18. Clojure: limite gc testa superato, valutazione pigra, sequenza pi
- 19. Clojure Editor scritto in Clojure
- 20. Clojure: cos'è esattamente la posizione della coda per ricorrere?
- 21. Clojure: si può ripetere solo dalla posizione di coda
- 22. Genera sequenza alfanumerica in Ruby
- 23. iterazione idioomatica su una sequenza dimensionale 2 (o superiore) in Clojure
- 24. Come trasformare un oggetto java Iterator in una sequenza di clojure
- 25. Qual è il modo migliore per gestire questa trasformazione di sequenza in Clojure?
- 26. In Clojure è una lista vuota una sequenza di null infiniti?
- 27. Come filtrare una mappa persistente in Clojure?
- 28. codice compatto Clojure per regolare le partite di espressione e la loro posizione nella stringa
- 29. Clojure apply vs map
- 30. Macro di filettatura generalizzata in clojure
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. –