2015-02-11 71 views
3

拉丁字符串我做這個實驗在REPL:排序Clojure中

(sort ["maa" "ácw" "ijl" "aez" "jkl"]) 

我得到這個:

("aez" "ijl" "jkl" "maa" "ácw") 

正確的答案是這樣的:

("ácw" "aez" "ijl" "jkl" "maa") 

是否有如何在Clojure中自然排序拉丁字符串?如果不是爲什麼不呢?

看我沒有問如何排序這個,我知道我可以通過管道傳遞seq並替換非ANSI字符。

回答

6

可以使用Collator類,在REPL:

=> (import java.util.Locale) 
java.util.Locale 
=> (import java.text.Collator) 
java.text.Collator 
=> (def collator (Collator/getInstance (Locale. "pt_BR"))) 
#'user/collator 
=> (sort collator ["maa" "ácw" "ijl" "aez" "jkl"]) 
("ácw" "aez" "ijl" "jkl" "maa") 

在這個例子中,我使用了巴西Locale。您需要將此語言環境更改爲您要使用的語言環境。有一個支持的語言環境列表here

+0

如果要排序的集合很大或出現問題,可以使用[Collat​​ionKey](http://docs.oracle.com/javase/7/docs/api/java/text/Collat​​ionKey.html),它比「Collat​​or」有更好的表現。不過,它需要更多的java interop和一些類型的暗示。 – 2015-02-11 17:50:36