在LISP中创建一个新的排序

JT9*_*T93 0 sorting common-lisp

我想在LISP中定义一个新的排序方法,坚持这个公式.

2> 3> 4> 5> 6> 7> 8> 9> 10> J> Q> K> A.

正如扑克所见.

所以我举例说:

(mysortmethod '((3 H)(2 H)(J D)(8 C)(5 C)))
Run Code Online (Sandbox Code Playgroud)

我会得到这个:

((2 H)(3 H)(5 C)(8 C)(J D))
Run Code Online (Sandbox Code Playgroud)

作为排序列表,其中忽略每个括号中的第二个元素.

我完全不知道怎么做.有人能指出我正确的方向或者向我解释一个方法吗?

Jos*_*lor 5

这是一种非常标准的Lisp练习.首先,您需要一种方便的方法来确定排序.一个简单的方法是保持一个点的序列(如果你有很多,可能是一个哈希表映射点到位置会更好)和一个比较它们的位置的函数:

(defconstant +pips+ #(2 3 4 5 6 7 8 9 10 J Q K A))

(defun pip< (pip1 pip2)
  (< (position pip1 +pips+)
     (position pip2 +pips+)))
Run Code Online (Sandbox Code Playgroud)

然后你可以使用标准排序函数(记住,它是破坏性的,所以保存结果,不要用引用数据调用它,因为你不应该修改文字数据),传递pip <作为谓词,首先作为键,因为你首先使用从每张卡中获得点数(因为你代表卡片作为点子和套装的列表):

CL-USER> (let ((hand (copy-tree '((3 H)(2 H)(J D)(8 C)(5 C)))))
           (sort hand 'pip< :key 'first))
;=> ((2 H) (3 H) (5 C) (8 C) (J D))
Run Code Online (Sandbox Code Playgroud)