Jas*_*ker 12 java character clojure letters
在Python中,我可以这样做:
>>> import string
>>> string.letters
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
Run Code Online (Sandbox Code Playgroud)
有没有办法在Clojure中做类似的事情(除了复制和粘贴上面的字符)?我查看了Clojure标准库和java标准库,但找不到它.
Ham*_*aya 20
如果你只想要Ascii字符,
(map char (concat (range 65 91) (range 97 123)))
Run Code Online (Sandbox Code Playgroud)
会产生,
(\A \B \C \D \E \F \G \H \I \J \K \L \M \N \O \P \Q \R \S \T \U \V \W \X \Y \Z
\a \b \c \d \e \f \g \h \i \j \k \l \m \n \o \p \q \r \s \t \u \v \w \x \y \z)
Run Code Online (Sandbox Code Playgroud)
Mic*_*rdt 13
一个正确的非以ASCII为中心的实现:
private static String allLetters(String charsetName)
{
CharsetEncoder ce = Charset.forName(charsetName).newEncoder();
StringBuilder result = new StringBuilder();
for(char c=0; c<Character.MAX_VALUE; c++)
{
if(ce.canEncode(c) && Character.isLetter(c))
{
result.append(c);
}
}
return result.toString();
}
Run Code Online (Sandbox Code Playgroud)
用"US-ASCII"调用它,你将获得所需的结果(除了大写字母首先).你可以用它来调用它Charset.defaultCharset(),但我怀疑你在大多数系统上获得的远远超过ASCII字母,即使在美国也是如此.
警告:只考虑基本的多语言平面.扩展到补充平面不会太难,但需要更长的时间,实用程序是值得怀疑的.
基于Michaels命令式Java解决方案,这是一个惯用的(懒惰序列)Clojure解决方案:
(ns stackoverflow
(:import (java.nio.charset Charset CharsetEncoder)))
(defn all-letters [charset]
(let [encoder (. (Charset/forName charset) newEncoder)]
(letfn [(valid-char? [c]
(and (.canEncode encoder (char c)) (Character/isLetter c)))
(all-letters-lazy [c]
(when (<= c (int Character/MAX_VALUE))
(if (valid-char? c)
(lazy-seq
(cons (char c) (all-letters-lazy (inc c))))
(recur (inc c)))))]
(all-letters-lazy 0))))
Run Code Online (Sandbox Code Playgroud)
更新: 感谢cgrand这个更好的高级解决方案:
(defn letters [charset-name]
(let [ce (-> charset-name java.nio.charset.Charset/forName .newEncoder)]
(->> (range 0 (int Character/MAX_VALUE)) (map char)
(filter #(and (.canEncode ce %) (Character/isLetter %))))))
Run Code Online (Sandbox Code Playgroud)
但我的第一种方法之间的性能比较
user> (time (doall (stackoverflow/all-letters "ascii")))
"Elapsed time: 33.333336 msecs"
(\A \B \C \D \E \F \G \H \I \J \K \L \M \N \O \P \Q \R \S \T \U \V \W \X \Y \Z \\
a \b \c \d \e \f \g \h \i \j \k \l \m \n \o \p \q \r \s \t \u \v \w \x \y \z)
Run Code Online (Sandbox Code Playgroud)
和你的解决方案
user> (time (doall (stackoverflow/letters "ascii")))
"Elapsed time: 666.666654 msecs"
(\A \B \C \D \E \F \G \H \I \J \K \L \M \N \O \P \Q \R \S \T \U \V \W \X \Y \Z \\
a \b \c \d \e \f \g \h \i \j \k \l \m \n \o \p \q \r \s \t \u \v \w \x \y \z)
Run Code Online (Sandbox Code Playgroud)
非常有趣.
不,因为那只是打印出ASCII字母而不是全套.当然,使用两个for循环打印26个小写字母和大写字母是微不足道的,但事实是在前127个代码点之外还有更多的"字母".Java中的"isLetter"字符对于这些和其他许多人都是正确的.