ClojureのすべてのASCII母音を削除する関数を作成しようとしています。私はClojureを初めて使用しますが、文字列に少し問題があります。たとえば、文字列"hello world"
はを返し"hll wrld"
ます。私は助けに感謝します!
2 に答える
そのために、文字列クラスの基礎となる関数を利用できます。
user=> (.replaceAll "hello world" "[aeiou]" "")
"hll wrld"
それが不正行為のように感じる場合は、文字列をseqに変換し、セットの補集合でフィルタリングしてから、それを文字列に戻すことができます。
user=> (apply str (filter (complement #{\a \e \i \o \u}) (seq "hello world")))
"hll wrld"
clojureのセットも関数です。complement
関数を受け取り、元の関数ではなく論理を返す関数を返します。これと同等です。apply
関数と一連の引数を取り、それらの引数を使用してその関数を呼び出します(大まかに言えば)。
user=> (apply str (filter #(not (#{\a \e \i \o \u} %)) (seq "hello world")))
"hll wrld"
編集
もう1つ...
user=> (apply str (re-seq #"[^aeiou]" "hello world"))
"hll wrld"
#"[^aeiou]"
は正規表現であり、re-seqは一致をseqに変換します。それはclojureのようなもので、うまく機能しているようです。Javaにドロップダウンする前にこれを試すかもしれません。文字列をseqするものはかなり遅いです。
重要な編集
もう1つの方法があり、それはを使用することclojure.string/replace
です。これは、ClojureまたはClojurescriptのいずれかで機能する必要があることを考えると、最良の方法である可能性があります。
例えば
dev:cljs.user=> (require '[clojure.string :as str])
nil
dev:cljs.user=> (str/replace "hello world" #"[aeiou]" "")
"hll wrld"
ビルはほとんど正しいですが、私が思うにこの答えを正当化するのに十分間違っています。
user=> (.replaceAll "hello world" "[aeiou]" "")
"hll wrld"
このソリューションは完全に受け入れられます。実際、それは提案された最良の解決策です。ソリューションが最もクリーンで最速であれば、Javaにドロップダウンしても問題はありません。
別の解決策は、彼が言ったように、シーケンス関数を使用することです。しかし、彼のコードは少し奇妙です。またはと一緒に使用filter
しないで(not ..)
くださいcomplement
。そのための特別な関数がありますremove
:
user> (apply str (remove #{\a \e \i \o \u} "hello world"))
"hll wrld"
また、文字列を呼び出す必要はありませんseq
。Clojureのseq関数はすべて、それを処理します。
彼の最後の解決策は興味深いものですが、それが含まれていないという理由だけで最初の解決策をお勧めし(apply str ..)
ます。