在Lisp中对char列表进行排序

时间:2016-12-29 16:53:55

标签: sorting lisp

是否有办法按字母顺序(从“a”到“z”)对仅由字符组成的列表进行排序,例如:( list c m a y k)=> (列出c k m y)?

我没有找到那种,所以我认为这可以解决问题:

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),这不是我想要的结果。

2 个答案:

答案 0 :(得分:0)

可以将字符转换为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)

答案 1 :(得分:0)

(c m a y k)的情况下,您有一个符号列表。 在(#\A #\C #\K #\M #\Y)的情况下,您有一个字符列表。

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

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

请注意,:key #'symbol-name可能被认为是多余的,因为string<实际上是对字符串指示符&#34;进行操作,但对于人类读者来说,确实更为清楚如果您明确说明,则打算根据符号名称对列表进行排序。