2013-07-30 16 views
8

Stworzyłem funkcję, aby sprawdzić, czy mój pierwszy ciąg kończy się z drugim ciągiem.Sprawdzanie, czy łańcuch kończy się danym ciągiem w clojure

W Javie mamy gotowego sposobu na sprawdzenie tego, ale w Clojure nie udało mi się znaleźć takiego sposobu więc pisemną funkcji niestandardowej następująco:

(defn endWithFun [arg1 arg2] 
    (= (subs arg1 (- (count arg1) (count arg2)) (count arg1)) arg2)) 

Wyjścia:

> (endWithFun "swapnil" "nil") 
true 
> (endWithFun "swapnil" "nilu") 
false 

ten działa zgodnie z oczekiwaniami.

Chcę wiedzieć, czy istnieje podobna alternatywa? Również w moim przypadku porównuję wielkość liter. Chcę również ignorować wielkość liter.

Odpowiedz

14

Można uzyskać dostęp do rodzimych Java endsWith bezpośrednio w Clojure:

(.endsWith "swapnil" "nil") 

Zobacz http://clojure.org/java_interop dla niektórych więcej szczegółów.

Można wtedy naturalnie komponować to, aby uzyskać case niewrażliwość:

(.endsWith (clojure.string/lower-case "sWapNIL") "nil") 
+0

Dziękuję, właśnie tego szukałem. teraz widzę, że mogę używać apletu java klasy 'String' przy użyciu' (.) ', próbowałem' (subs "swapbil" 1 4) 'i' (. "swapnil" substring 1 4) 'both gives ans * * wap **, czy jest jakaś degradacja wydajności, jeśli używam java w clojure? albo oba będą miały taką samą wydajność. – swapy

+0

Wyobrażam sobie, że wydajność powinna być porównywalna. Jeśli martwisz się, możesz zbudować szybki mikro-benchmark. –

+0

Ogólnie rzecz biorąc jedyną karą za wydajność, z jaką można korzystać w Javie w Clojure, jest użycie refleksji, aby wyszukać metodę w środowisku wykonawczym, jeśli nie można wywnioskować klasy obiektu podczas kompilacji. Funkcja 'clojure.string' działa we wszystkich typach wskazówek, aby uniknąć refleksji, więc powinna istnieć pomijalna różnica w wydajności między wersjami Clojure i Java. – Alex

4

Clojure 1.8 wprowadzono funkcję ends-with? w clojure.string, więc teraz nie jest rodowitym funkcja:

> (ends-with? "swapnil" "nil") 
true 
> (ends-with? "swapnil" "nilu") 
false 

Ponownie, po prostu zastosować lower-case, jeśli chcesz mieć niewrażliwość na wielkość liter.

Powiązane problemy