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

时间:2013-08-17 15:53:38

标签: common-lisp

我知道如何用我所知道的其他语言做到这一点,但我只是开始使用Lisp并且没有得到它。

的想法
  • 制作角色列表
  • 转换为ascii值
  • 排序
  • 转换回字符
  • 转换回字符串
似乎很苛刻。有没有更好的方法来做到这一点?我正在尝试编写一个函数,给定一个字符串,返回一个字母排序的字符串。所以,例如:

gate => aegt
house => ehosu
door => door

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

谢谢!

3 个答案:

答案 0 :(得分:10)

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

以下是一个例子:

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

here's sortstable-sort的Hyperspec条目。只需选择您的谓词(sort的第二个参数)即可获得所需的排序顺序。

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

答案 1 :(得分:6)

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

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

"ollhe"

答案 2 :(得分:2)

字符串是一系列字符。 sort对序列进行排序,以便对字符串进行排序,就像对列表进行排序一样:

(setq tester (copy-seq "lkjashd")) =>  "lkjashd"
(stable-sort tester #'char-lessp) =>  "adhjkls"
tester => "adhjkls" ; NB: it mutates the string!