Czy Clojure zapewnia dowolny wbudowany sposób wyszukiwania pozycji pod-sekwencji w danej sekwencji?Pozycja podporządkowania Clojure w sekwencji
Odpowiedz
Clojure zapewnia wbudowany sposób na łatwe Java Interop.
(java.util.Collections/indexOfSubList '(a b c 5 6 :foo g h) '(5 6 :foo))
;=> 3
Sekwencja to abstrakcja, a nie konkrecja. Pewne konkrecje, które można wykorzystać poprzez abstrakcję sekwencji, mogą znaleźć pozycję podciągu (na przykład łańcuchy i kolekcje java), ale sekwencje w ogóle tego nie robią, ponieważ ukryta konkrecja nie musi mieć indeksu .
Co jednak można zrobić, to stworzyć zestaw tożsamości elementu i funkcji indeksu. Spójrz na map-indexed.
Oto naiwna implementacja, która leniwie znajdzie pozycję (wszystkich) podciągów w sekwencji. Wystarczy użyć najpierw zabrać 1 lub tylko jednego, aby znaleźć:
(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)
zadbać, algorytmy indeksów opartych na ogół nie są czymś byś zrobił w języku funkcjonalnym. O ile nie istnieją dobre powody, dla których potrzebny jest indeks w ostatecznym wyniku, rozległe użycie wyszukiwania indeksu jest uznawane za zapach kodu.
- 1. Typ sekwencji clojure
- 2. Dodaj pozycje do listy/sekwencji w Clojure
- 3. Co to jest pozycja pod względem sekwencji?
- 4. Pytanie idiomatycznego clojure o transformacji sekwencji
- 5. Clojure: w jaki sposób wywoływać idiomatyczne połączenia? na leniwej sekwencji
- 6. W Clojure jest pustą listą sekwencji nieskończonych wartości null?
- 7. Przetwarzanie par wartości z dwóch sekwencji w Clojure
- 8. Clojure: Tworzenie leniwej sekwencji fragmentów bajtów ze strumienia wejściowego
- 9. Jak zmienić obiekt podobny do iteratora java do sekwencji clojure
- 10. Ustaw klasę Java jako sekwencję w Clojure
- 11. Wracając duplikatów w sekwencji
- 12. Konwersja sekwencji sekwencji do słownika i odwrotnie
- 13. Pozycja Komponenty w Kręgu
- 14. pozycja Mouse w D3
- 15. Pozycja ikony w QTreeWidgetItem
- 16. Pozycja podłańcucha w NSString
- 17. Clojure nie łapania NumberFormatException
- 18. Josephus sekwencji
- 19. Średniej wielkości aplikacja Clojure?
- 20. Kolumna Google pozycja legenda pozycja wykresu
- 21. Kiedy należy unikać używania `seq` w Clojure?
- 22. Jak filtrować trwałą mapę w Clojure?
- 23. Wyjaśnij leniwy trójkąt Pascala w Clojure
- 24. Jak mogę zaktualizować element wektorowy w Clojure?
- 25. vector.assign() z wartością w sekwencji
- 26. Określanie sekwencji kolorów w ListPlot
- 27. Błąd sekwencji funkcji w PYODBC
- 28. Wyszukiwanie podsekwencji w dłuższej sekwencji
- 29. Dopasowywanie sekwencji w większym wektorze
- 30. Znaleźć brakującą liczbę w sekwencji
Dziękuję za odpowiedź. To właśnie wykorzystam na końcu, ale zwykle staram się unikać bezpośredniego wywoływania Java Interop z kodu "biznesowego", ponieważ uważam, że jest trochę gadatliwy. Dziękuję jednak. –
Chociaż może to działać, należy pamiętać, że kolekcja nie jest sekwencją. – NielsK
@NielsK Pojęcia filozoficzne na bok, myślę, że znajdziesz 'java.util.List' jako superklasę' seq' i że metoda java jest w parze 'java.util.List's. Jako takie, możesz użyć tego na leniwych sekwencjach (po prostu uważaj, aby nie ocenić nieskończonego) '(java.util.Collections/indexOfSubList (zakres 10) (zakres 3 7)); => 3', wektory, posortowane- mapy itp. –