Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
2 replies to this topic

#1 --NK--

--NK--

    biết zoom

  • Members
  • Pip
  • 15 Bài viết
Điểm đánh giá: 2 (bình thường)

Đã gửi 29 May 2013 - 04:29 PM

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.


  • 0

#2 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 29 May 2013 - 05:07 PM

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


  • 2

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#3 --NK--

--NK--

    biết zoom

  • Members
  • Pip
  • 15 Bài viết
Điểm đánh giá: 2 (bình thường)

Đã gửi 29 May 2013 - 05:19 PM

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


  • 0