如何根据另一个列表list
中定义的顺序对sorter
进行排序:
list = ( (:value "A" :index 0) (:value "B" :index 1) (:value "C" :index 2) )
sorter = (1 2 0)
导致:
list* = ( (:value "B" :index 1) (:value "C" :index 2) (:value "A" :index 0) )
由于
答案 0 :(得分:1)
这似乎是一项功课。我会给你一些关于我乍看之下怎么做的迹象。并不意味着它是最好的解决方案,但当然可以指出一种解决方法。
获取sorter
列表,并构建一个哈希表,对于列表中的每个数字,它将其位置存储在列表中(例如,它将保留( (1 -> 0) (2 -> 1) (0 -> 3) )
与您显示的列表。 )
接下来,使用适当的任何排序函数在CL库中指定:key
和相应的比较函数。也就是说,关键函数应该访问每个元素中的索引字段,比较函数应该比较每个索引字段元素的散列值。
答案 1 :(得分:0)
你可以这样做:
(defun my-sort (lst idx)
(labels
((getall (i) (remove-if-not (lambda (e) (= i (getf e :index))) lst)))
(loop for i in idx append (getall i))))
然后
(my-sort '((:value "A" :index 0) (:value "B" :index 1) (:value "C" :index 2)) '(1 2 0))
=> ((:VALUE "B" :INDEX 1) (:VALUE "C" :INDEX 2) (:VALUE "A" :INDEX 0))