根据常见的lisp中的另一个列表对列表进行排序

时间:2014-01-02 11:12:53

标签: sorting lisp common-lisp

如何根据另一个列表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) )

由于

2 个答案:

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