Chuyển đến nội dung
Diễn đàn CADViet
  • Thông báo

    • Nguyen Hoanh

      CADViet đã hoàn tất nâng cấp   14/09/2017

      Chào các bạn, CADViet đã hoàn tất việc nâng cấp lên phiên bản mới. Tất cả các chức năng đã hoạt động theo kỳ vọng của ban quản trị. Nếu có vấn đề gì cần phản hồi, các bản post ở đây nhé: Trân trọng, Nguyễn Hoành.
--NK--

[Yêu cầu] Lisp sắp xếp trong danh sách.

Các bài được khuyến nghị

--NK--    2

Mình có 1 danh sách gồm các cặp dấu chấm như thế này :

(("L150x75x9" . "3500")("L75x75x6" . "365")("L75x75x9" .  "650")("L75x75x6" . "1200")(L100x75x7" . "1500"))

Mình muốn nó sắp xếp theo thứ tự như sau:

       - Đầu tiên ưu tiên sắp xếp theo Size (theo trình tự L150 - L100 - L75)

       - Nếu giống nhau về size thì theo kích thước vd : ("L75x75x6" . "1200") thì đứng trước ("L75x75x6" . "365")

       - Nếu giống nhau về loại size như L75 thì sắp xếp theo bề dày : vd -- L75x75x9  thì đứng trước L75x75x6

 

 

Kết quả mong muốn :

(("L150x75x9" . "3500")(L100x75x7" . "1500")("L75x75x9" .  "650")("L75x75x6" . "1200")("L75x75x6" . "365"))--> OK

 

Mong sự giúp đỡ của mọi người.

Cảm ơn sự hồi đáp.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Doan Van Ha    2.676

Hàm sort của bạn khá là phức tạp.

Lisp đây!


;Doan Van Ha - CADViet.com - Ngay 29/5/2013
;Chuc nang: sort 1 list phuc tap.
;-----  Sort list
;(setq lst '(("L75x75x6" . "356") ("L75x75x6" . "1400") ("L100x75x7" . "1400") ("L100x75x7" . "1200") ("L75x75x9" . "1400") ("L150x90x9" . "3200")))
; => '(("L150x90x9" . "3200") ("L100x75x7" . "1400") ("L100x75x7" . "1200") ("L75x75x9" . "1400") ("L75x75x6" . "1400") ("L75x75x6" . "356"))
(defun HA(lst)
 (vl-sort lst '(lambda(a b / xx yy)
   (setq xx (HA:ass->lst a "x") yy (HA:ass->lst b "x"))
   (if (/= (car xx) (car yy))
    (> (car xx) (car yy))
    (if (/= (cadr xx) (cadr yy))
     (> (cadr xx) (cadr yy))
     (if (/= (caddr xx) (caddr yy))
      (> (caddr xx) (caddr yy))
      (> (cadddr xx) (cadddr yy))))))))
(defun HA:ass->lst(ass del / str pos lst)
 (setq str (substr (car ass) 2 (strlen (car ass))))
 (while (setq pos (vl-string-search del str))
  (setq lst (cons (substr str 1 pos) lst) str (substr str (+ pos 1 (strlen del)))))
 (mapcar 'read (reverse (cons (cdr ass) (cons str lst)))))
 

  • Vote tăng 2

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
--NK--    2

Mình đã test thử--> chạy ok

cảm ơn bạn rất nhiều.

Mình kẹt ở đây đã 3 ngày mà nghĩ chưa ra.

 

Chúc 1 ngày tốt lành. :D

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Tạo một tài khoản hoặc đăng nhập để nhận xét

Bạn cần phải là một thành viên để lại một bình luận

Tạo tài khoản

Đăng ký một tài khoản mới trong cộng đồng của chúng tôi. Điều đó dễ mà.

Đăng ký tài khoản mới

Đăng nhập

Bạn có sẵn sàng để tạo một tài khoản ? Đăng nhập tại đây.

Đăng nhập ngay


×