在LISP中创建一个新的排序

时间:2015-01-28 14:15:47

标签: sorting common-lisp

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

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

在扑克中看到。

例如,我就这样称呼它:

(mysortmethod '((3 H)(2 H)(J D)(8 C)(5 C)))

我会得到这个:

((2 H)(3 H)(5 C)(8 C)(J D))

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

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

1 个答案:

答案 0 :(得分: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+)))

然后你可以使用标准的sort功能(记住它具有破坏性,所以保存结果,不要用引用的数据来调用它,因为你不应该修改它文字数据),将 pip&lt; 作为谓词并将first作为关键字,因为您使用first从每张卡片中获取点数(因为您正在表示)卡片作为一个点子和一套西装的名单):

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))