2013-02-28 10 views

Odpowiedz

18

użyć następujących

(filter #(Character/isUpperCase %) `(\$ \# \A \(\* \& \9 \8 \7 \Z \f)) 

Wyniki: (\A \Z)

+1

Dzięki. Jest to funkcja haha ​​java. – yehe

+0

Bez użycia Java: '(filter # (not = (str%) (clojure.string/lower-case%)) \' (\ $ \ # \ A \ (\ * \ & \ 9 \ 8 \ 7 \ Z \ \ f)) ' – Xavi

0

Jest to bardziej rozwlekły, ale można również zdefiniować własną funkcję, aby to zrobić:

(defn cap-detector [x] (loop [res [] arg (apply str x)] (cond (empty? arg) (filter (fn [x] (Character/isLetter x)) res) :else (if (= (clojure.string/upper-case (first arg)) (str (first arg))) (recur (conj res (first arg)) (rest arg)) (recur res (rest arg))))))

i wywołać cap-detector z twoją sekwencją znaków da ci to, co chcesz:

(cap-detector '(\$ \# \A \(\* \& \9 \8 \7 \Z \f)) => (\ A \ Z)

1

Albo można też użyć re-seq i wyrażeń regularnych:

((fn [x] (seq (apply str (re-seq #"[A-Z]" (apply str x))))) '(\$ \# \A \(\* \& \9 \8 \7 \Z \f))

co również zwraca (\A \Z).

+0

Zakładając, że' x' jest już ciągiem, najgłębsze '(apply str x)' może być zastąpione właśnie 'x'. – byxor

2

Moje rozwiązanie:

(filter (set (map char (range 65 91))) 
     '(\$ \# \A \(\* \& \9 \8 \7 \Z \f)) 

Powroty:

'(\A \Z) 
Powiązane problemy