我有一个这样的列表(preorder-mst)组成的列表:
((arc graph-id vertex-a vertex-b weight)((arc graph-id vertex-a vertex-b weight)...)
我想做的是按权重对子列表进行排序,如果2个权重相等,则按顶点b排序。
我试图调用一个函数来对元素进行排序
(sort preorder-mst 'compare-string-number)
(defun compare-string-number (firstLIST secondLIST)
(if (eql (fifth firstLIST) (fifth secondLIST))
(if (string-lessp (fourth firstLIST) (fourth secondLIST))
(fourth firstLIST)
(fourth secondLIST))
(when T
(if (< (fifth firstLIST) (fifth secondLIST))
(fifth firstLIST)
(fifth secondLIST)))))
它返回正确的值,但没有正确对它们进行排序。知道这有什么问题吗?
我的(不需要的)输出:
(((ARC GRAFO_TEST_1 CI 2)(ARC GRAFO_TEST_1 GH 1)(ARC GRAFO_TEST_1 NIL A 0)(ARC GRAFO_TEST_1 BC 8)(ARC GRAFO_TEST_1 AB 4))
排序中使用的谓词是这样的:它们接受两个参数并返回true或false。如果谓词返回true,则排序时优先考虑第一个参数,否则考虑第二个参数。要了解有关sort如何工作及其谓词的更多信息,请参见此处。
请记住,几乎所有值在Lisp中都是“真实的”,而空列表或nil为假。在hyperspec中可以看到术语广义布尔值。
您的函数几乎总是返回true,因为它返回要比较的元素且它们具有真实值。要解决此问题,您必须自己返回比较:
(defun graph-sort-p (firstLIST secondLIST)
(if (= (fifth firstLIST) (fifth secondLIST))
(string-lessp (fourth firstLIST) (fourth secondLIST))
(< (fifth firstLIST) (fifth secondLIST))))
(sort my-list #'graph-sort-p)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句