Common-Lisp:如何对字符串的字符进行排序?

Oli*_*lie 4 common-lisp

我知道如何用我所知道的其他语言做到这一点,但我只是开始使用Lisp而不是完全掌握它.我的想法

  • 制作一个人物清单
  • 转换为ascii值
  • 分类
  • 转换回字符
  • 转换回字符串

看似蛮横.有没有更好的方法来做到这一点?我正在尝试编写一个函数,给定一个字符串,返回一个字母排序的字符串.所以,例如:

gate => aegt
house => ehosu
door => door
Run Code Online (Sandbox Code Playgroud)

此例程将用作anagram-finder的一部分.

谢谢!

jbm*_*jbm 10

在Common Lisp中,字符串是序列,并且sort适用于任何序列类型,因此它可以解决问题.

这是一个例子:

(let ((the-string (copy-seq "this is the string")))
  (sort the-string #'char-lessp))
;; => "   eghhiiinrsssttt"
Run Code Online (Sandbox Code Playgroud)

这里是为Hyperspec进入sortstable-sort.只需选择你的谓词(第二个参数sort)来获得你想要的排序顺序.

请注意,我copy-seq在示例中使用因为sort是破坏性的 - 它就地修改了字符串.

  • @wvxvw,LispWorks的文档明确地将字符串(和通常的向量)识别为[有资格进行常量折叠](http://www.lispworks.com/documentation/lcl50/aug/aug-53.html).在底部的例子中,他们建议不要使用`copy-seq`来改变定义为文字的向量. (2认同)

svk*_*svk 6

sort函数采用一个字符串已经存在的序列,因此您唯一的问题是找到正确的比较函数.字符不是数字,因此您应该使用字符比较函数,例如char>:

* (sort (copy-seq "hello") #'char>)

"ollhe"
Run Code Online (Sandbox Code Playgroud)