繁体   English   中英

在Lisp中对char列表进行排序

[英]Sorting a list of char in Lisp

有没有一种方法可以对仅由字母组成的列表进行排序(从“ a”到“ z”),例如:(list cmayk)=>(list ackmy)?

我没有找到这样的东西,所以我认为这可以解决问题:

cl-prompt> (setq q (mapcar 'string '(c m a y k))) => ("C" "M" "A" "Y" "K")
cl-prompt> (sort q 'string<) => ("A" "C" "K" "M" "Y")

在这一点上,我很困惑,因为通过使用char转换器,输出将不是我想要的列表。 例:

char (string 'a) 0 => #\A

我将得到一个列表,其中包括:(#\\ A#\\ C#\\ K#\\ M#\\ Y),这不是我想要的结果。

可以将字符转换为其ASCII数字,对数字进行排序,然后转换回字符。 以下是Racket中的一个Lisp / Scheme派生代码:

(define l (list #\c #\m #\a #\y #\k))
(map integer->char
     (sort (map char->integer l) <))

输出:

'(#\a #\c #\k #\m #\y)

对于(cmayk) ,您有一个符号列表。 (#\\A #\\C #\\K #\\M #\\Y) ,您有一个字符列表。

如果要根据符号名称对符号列表进行排序,可以这样做(我假设该列表绑定到下面的变量foo):

(setq foo (sort foo #'string< :key #'symbol-name))

注意:key #'symbol-name可能被认为是多余的,因为string<实际上是在“字符串指定符”上运行的,但是对于人类读者来说,您确实打算根据符号名对列表进行排序如果你这么明确地说。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM