关于表处理,各位老师进来指点下
本帖最后由 qinleilei 于 2016-8-3 18:45 编辑最近碰到了一个关于表处理问题,不知道怎么弄,请各位老师指点下
下面的表是由坐标 图元名 组成的一个表
( (pt1 e1) (pt2 e2) (pt3 e3) (pt4 e4) (pt5 e5) (pt6 e6)(pt7 e7) 此处还有很多省略.....)
判断表中 坐标相同的图元名 归在一起,比如 pt1 pt3 pt7 坐标相同pt2 pt5 坐标相同pt4 pt6 坐标相同 ,此处还有很多省略...
处理完后达到下面的效果
((pt1e1 e3 e7 ) (pt2 e2 e5) (pt4 e4 e6)此处还有很多省略.....)
函数怎么写,才能快速处理成这样的效果?
问题解决了,
真的很感谢大家的帮忙,谢谢了!
本帖最后由 llsheng_73 于 2016-8-2 19:36 编辑
(setq a nil
lst(list(list pt1 e1)(list pt2 e2)(list pt3 e3)(list pt4 e4)(list pt5 e5)(list pt6 e6)(list pt7 e7)))
;;考虑坐标精度问题,取小数后三位
(mapcar'(lambda(x)(cons(mapcar'atof(car x))(cdr x)))
(foreach x lst
(setq x(cons(mapcar'(lambda(x)(rtos x 2 3))(car x))(cdr x))
a(if(setq c(car x)b(assoc c a))
(subst(append b(cdr x))b a)
(append a(list x))))))
;;不考虑坐标精度就简单多了
(foreach x lst
(setq a(if(setq c(car x)b(assoc c a))
(subst(append b(cdr x))b a)
(append a(list x))))) 写个循环while 试试这个
(defun c:tt ()
(setq lst0 '(((1.0 1.0) a)
((1.0 1.0) b)
((1.0 2.0) c)
((2.0 2.0) d)
((2.0 2.0) e)
((2.0 3.0) e)
)
) ;测试样表
(defun delsame (l)
(if l
(cons (car l) (delsame (vl-remove (car l) l)))
)
)
(setq lst (delsame (mapcar 'car lst0)))
(setq lst (mapcar 'list lst))
(foreach x lst0
(setq x1 (assoc (car x) lst))
(setq lst (subst (append x1 (cdr x)) x1 lst))
)
)
可以参考:游程编码 坐标精度。。学习 Sylvanas 发表于 2016-8-2 08:54
试试这个
(defun c:tt ()
递归,数量多了以后速度巨慢,怎么解决?
页:
[1]