簡體   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