明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1697|回复: 3

[提问] 求助,关于表相同元素处理。

[复制链接]
发表于 2014-3-11 13:41:37 | 显示全部楼层 |阅读模式
本帖最后由 雪山飞狐_lzh 于 2014-9-13 22:35 编辑

下表TT 里 有重复的元素。我需要将重复元素前面添加数字符来区分。请高手帮帮。多谢!!!!
(setq  tt (list "1" "2" "3" "4" "5" "1" "2" "3" ))
  (list "Ⅰ1" "Ⅰ2" "Ⅰ3" "4" "5" "Ⅱ1" "Ⅱ2" "Ⅱ3" )
发表于 2014-4-30 13:31:55 | 显示全部楼层
;;开始study
(defun test (tt / n n_1 n_2 lst_1 I J tang tang_1)
  (setq        n     (length tt)
        n_1   0
        lst_1 tt
  )
  (while (< n_1 n)
    (if        (not (listp (nth n_1 lst_1) ))
        ;;(listp 元素)判断元素是否为串  
      (progn
        (setq a_1 (nth n_1 lst_1))
        (setq n_2 (+ n_1 1)
              I          0
        )
        ;;求单个元素的最大次数I
        (while (< n_2 n)
          (setq a_2 (nth n_2 tt))
          (if (= a_2 a_1)
            (progn
              (setq I (+ I 1))
            )
          )
          (setq n_2 (+ n_2 1))
        )                                ;(while (< n_2 n) 函数结束
        (setq lst_1 (subst (list a_1 0 I) a_1 lst_1))

        ;;下面处理单个元素的次数
        (setq n_2 (+ n_1 1)
              J          0
        )
        (while (< n_2 n)
          (setq a_2 (nth n_2 tt))
          (if (= a_2 a_1)
            (progn
              (setq J         (+ J 1)
                    tang lst_1
              )
              ;;处理元素a_2 以后的数列
              (repeat (+ n_2 1)                ;(setq n_2 5  j 0)
                (setq tang (cdr tang))
              )
              (setq tang (cons (list a_1 J I) tang))
              (setq tang_2 (reverse lst_1))
              ;;处理元素a_2 以前的数列
              (repeat (- n n_2)
                (setq tang_2 (cdr tang_2))
              )
              (setq tang_2 (reverse tang_2))
              (setq lst_1 (append tang_2 tang))
            )
          )
          (setq n_2 (+ n_2 1))
        )
        ;;处理单个元素的次数函数结束
      )
    )
    ;;(if (= (length (nth n_1 lst_1)) 1) 函数结束
    (setq n_1 (+ n_1 1))
  )                                        ;(while (< n_1 n) 函数结束



  ;;下面对变换后的数组lst_1 进行处理
  ;;( setq instead lst_1)  (setq lst_1 instead )   
  (setq        n   (length lst_1)
        n_1 0
        a_1 nil
  )
  (while (< n_1 n)
    ;; (setq n_1 3)
    (setq a_1 (nth n_1 lst_1))
    (cond
      ((= (caddr a_1) 0)
       (setq lst_1 (subst (car a_1) a_1 lst_1))
      )
      (t
       (setq b  (change_number(cadr a_1) ))
       (setq b (strcat   b  (car a_1))  )
       (setq lst_1 (subst b a_1 lst_1))
      )
    )
    (setq n_1 (+ n_1 1))
  )
  ;;(while (< n_1 n) 函数结束
  lst_1
)
;; ( test tt )  
;;  (ascii "Ⅰ") (setq fun "chinaⅠtang") (vl-string-position 162 fun)



;;下面函数建立(0-10)整数 和小写字母的联系
(defun connect        (number / n_1 n lst_1 lst_2 lst string)
  (setq        lst_1 (list (list 1 "一")
                    (list 2 "二")
                    (list 3 "三")
                    (list 4 "四")
                    (list 5 "五")
              )
        lst_2 (list (list 6 "六")
                    (list 7 "七")
                    (list 8 "八")
                    (list 9 "九")
                    (list 0 "零")
              )
        lst   (append lst_1 lst_2)
        n     (length lst)
        T_1   t
        n_1   0
  )
  (while (and (< n_1 n) T_1)
    (setq a_1 (car (nth n_1 lst)))
    (if        (= number a_1)
      (setq string (cadr (nth n_1 lst))
            T_1           nil
      )
    )
    (setq n_1 (+ n_1 1))
  )
  string
)
;;connenct 函数结束   (connect 5)

;;下面把整数转换成字符串
;; (setq num 12798)
(defun change_number (num / n_1 module t_1 a_2 a_1 lst lst_1 lst_2 value )
  (setq        module 10
        t_1 t
        lst  nil
        lst_1 nil
  )
  (while t_1
    (setq a_2 (rem num module)
          a_1 (- num a_2)
          
    )
    (if        (> a_1 0)
      (setq t_1           t
            module (* module 10)
            lst           (cons   a_2  lst)
      )
      (setq t_1 nil)
    )
  )
  ;;while t_1 函数结束
  (setq lst (cons num lst))
  (setq lst (reverse lst))
  ;;对数组取整数
  (setq n_1 1
        lst_1 (cons (car lst) lst_1)
         )
  (while (< n_1 (length lst))
    (setq a_1 (nth (- n_1 1) lst)
          a_2 (nth n_1 lst)
    )
    (setq a_3 (/ (- a_2 a_1) (expt 10 n_1)))
    (setq lst_1 (cons a_3   lst_1))
    (setq n_1 (+ n_1 1))
  )
  ;;换算成小写字母
  (setq lst_2 (mapcar '(lambda (x) (connect x)) lst_1))
  (setq value "")
   (setq lst_2 (reverse lst_2))
  (foreach try lst_2
    (setq value (strcat try value))
  )
  value
)
;; (change_number 7860904)

发表于 2014-4-30 13:49:07 | 显示全部楼层

  1. (defun c:tt ()
  2.   (setq tt (list "1" "2" "3" "4" "5" "1" "2" "3")
  3.         lst '()
  4.   )
  5.   (foreach a tt
  6.     (if (member a lst)
  7.       (setq a (strcat "Ⅱ" a))
  8.     )
  9.     (setq lst (cons a lst))
  10.   )
  11.   (setq lst (reverse lst))
  12. )

点评

学习院长的程序。不过好像你这个不能I II III 这样加上去,与楼主的需求还是有差别  发表于 2014-6-27 08:58
院长牛呀,源码支持你!  发表于 2014-5-12 10:39
发表于 2014-5-11 22:17:04 | 显示全部楼层
好玩,老猫也有不明白的地方

点评

楼主写分类错了,那不是我  发表于 2014-6-22 15:11
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-5-24 20:08 , Processed in 0.182380 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表