2012-10-24 42 views
4

我试图编写一个函数去除Clojure中的所有ASCII元音。我对Clojure很陌生,并且对字符串有点麻烦。例如,字符串"hello world"将返回"hll wrld"。我感谢帮助!clojure中的剥离元音

回答

15

您可以利用字符串类的基础功能。

user=> (.replaceAll "hello world" "[aeiou]" "")   
"hll wrld" 

如果感觉就像作弊,你可以把该字符串转换成一个序列,然后用一组的补过滤,然后把那回字符串。

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" 

编辑

一个更多...

user=> (apply str (re-seq #"[^aeiou]" "hello world")) 
"hll wrld" 

#"[^aeiou]"是一个正则表达式,并重新打开序列比赛成起。它像clojure一样,似乎表现良好。在下降到Java之前,我可能会尝试这个。 seq字符串的速度比较慢。

重要编辑

还有另一种方式,那就是用clojure.string/replace。鉴于它可以在Clojure或Clojurescript中工作,这可能是最好的方式。

例如

dev:cljs.user=> (require '[clojure.string :as str]) 
nil 

dev:cljs.user=> (str/replace "hello world" #"[aeiou]" "") 
"hll wrld" 
+0

非常有帮助,非常感谢你 –

+0

@JoeCrawley感谢您接受答案。我刚刚添加了一个,可能是最好的。祝你好运! – Bill

+5

'还有'(remove pred ...)'(filter(补偿pred)...)'。你不必在字符串上调用'seq'。序列函数以您的名义完成。 – kotarak

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 ..)

+1

我喜欢删除的例子。谢谢! – Bill

+0

另外,String/replaceAll的缺点是它每次都会创建一个新的Pattern对象。尽管如此,它的速度仍然比塞庆快。 – Bill

+0

@ Bill还有一个替换匹配器的版本。你可以做到这一点,而不是每次都创建一个模式对象。 – Rayne