Common lisp CommonLisp:如何对字符串的字符进行排序?
我知道如何在我所知道的其他语言中做到这一点,但我只是开始使用Lisp,还没有完全理解它。我的想法Common lisp CommonLisp:如何对字符串的字符进行排序?,common-lisp,Common Lisp,我知道如何在我所知道的其他语言中做到这一点,但我只是开始使用Lisp,还没有完全理解它。我的想法 列一个字符列表 转换为ascii值 分类 转换回字符 转换回字符串 似乎很严厉。有没有更好的办法?我试图写一个函数,给定一个字符串,返回一个字母排序的字符串。例如: gate => aegt house => ehosu door => door 此例程将用作字谜查找程序的一部分 谢谢 sort函数接受一个序列,该序列已经是一个字符串,因此您唯一的问题是找到正确的比较函数。字
- 列一个字符列表
- 转换为ascii值
- 分类
- 转换回字符
- 转换回字符串
gate => aegt
house => ehosu
door => door
此例程将用作字谜查找程序的一部分
谢谢 sort函数接受一个序列,该序列已经是一个字符串,因此您唯一的问题是找到正确的比较函数。字符不是数字,因此您应该使用字符比较功能,例如
char>
:
* (sort (copy-seq "hello") #'char>)
"ollhe"
字符串是一个字符序列。对序列进行排序,使其对字符串进行排序,就像对列表进行排序一样:
(setq tester (copy-seq "lkjashd")) => "lkjashd"
(stable-sort tester #'char-lessp) => "adhjkls"
tester => "adhjkls" ; NB: it mutates the string!
在常见的Lisp中,字符串是序列,
sort
适用于任何序列类型,因此它可以实现这一点
下面是一个例子:
(let ((the-string (copy-seq "this is the string")))
(sort the-string #'char-lessp))
;; => " eghhiiinrsssttt"
以及用于排序
和稳定排序
的Hyperspec条目。只需选择谓词(sort的第二个参数)即可获得所需的排序顺序
请注意,我在示例中使用了
copy seq
,因为sort
具有破坏性-它在适当的位置修改了字符串。啊,谢谢!我知道字符串是序列,但不知道#'char>
——太好了!顺便说一句,你的答案是正确的&首先,我选择了jbm,因为(a)他提供了更多的细节,这对我的案例很有帮助,(b)我想鼓励一个低代表性的海报,他给出了很好的答案(我想他在我选择它的时候是2xx)。所以:没有什么个人的,你的答案也很好!但是上面说“只能有一个。”;)很好的解释,谢谢。比起charThanks Olie,#char-lessp
更受欢迎,我很高兴能帮上忙。区别在于#'char-lessp
忽略大小写,而#'charI认为复制文本字符串有点过分。。。您不可能通过就地更改它来影响任何其他内容,因为您刚刚在此处定义了它。@wvxvw常量折叠。。。我认为(尽管我必须仔细阅读CLH以确认)CL实现完全可以折叠(let((a“foo”)(b“foo”)…)
到(let(((#:temp“foo”)(let((a#:temp)(b#:temp))…)
在这种情况下,排序a
会产生一个令人惊讶的副作用,排序b
@wvxvw,LispWorks的文档明确地将字符串(通常是向量)标识为。在底部的示例中,他们建议不要在不使用copy seq
的情况下对定义为文本的向量进行变异。