4

ClojureのすべてのASCII母音を削除する関数を作成しようとしています。私はClojureを初めて使用しますが、文字列に少し問題があります。たとえば、文字列"hello world"はを返し"hll wrld"ます。私は助けに感謝します!

4

2 に答える 2

15

そのために、文字列クラスの基礎となる関数を利用できます。

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"
于 2012-10-24T03:51:46.163 に答える
8

ビルはほとんど正しいですが、私が思うにこの答えを正当化するのに十分間違っています。

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 ..)ます。

于 2012-10-24T10:44:38.210 に答える