TheSwamp

Code Red => AutoLISP (Vanilla / Visual) => Topic started by: Coder on July 05, 2020, 06:58:15 AM

Title: sort a list of strings
Post by: Coder on July 05, 2020, 06:58:15 AM
Hello guys.

I have a problem with sorting a list of strings based on the second item of the list ascendingly.

Code: [Select]
(setq the_list '(("Top Beam" "200x150") ("Left Beam" "200x100") ("Left Beam" "150x200") ("Bottom Beam" "225x75")
                 ("Bottom Beam" "100x200") ("Right Beam" "45x35") ("Bottom Beam" "100x175") ("Right Beam" "55x25")))

Code: [Select]
(vl-sort the_list
         '(lambda (x y)
            (< (cadr x) (cadr y))
          )
)
The result is not correct.

Thank you.
Title: Re: sort a list of strings
Post by: Dlanor on July 05, 2020, 09:40:59 AM
Try this. It uses a string->list function

Code - Auto/Visual Lisp: [Select]
  1. (defun _split (str char / pos lst )
  2.   (while (vl-string-position (ascii char) str)
  3.           (setq lst (cons (substr str 1 (setq pos (vl-string-position (ascii char) str))) lst)
  4.                 str (substr str (+ 2 pos))
  5.           );end_setq
  6.   );end_while
  7.   (setq lst (vl-remove-if '(lambda (x) (= x "")) (reverse (cons str lst))))
  8. );end_defun
  9.  
  10. (setq the_list '(("Top Beam" "200x150") ("Left Beam" "200x100") ("Left Beam" "150x200") ("Bottom Beam" "225x75")
  11.                  ("Bottom Beam" "100x200") ("Right Beam" "45x35") ("Bottom Beam" "100x175") ("Right Beam" "55x25")))
  12.  
  13. (vl-sort the_list '(lambda (x y / a b)
  14.                      (setq a (_split (cadr x) "x") b  (_split (cadr y) "x"))
  15.                      (if (= (atoi (car a)) (atoi (car b))) (< (atoi (cadr a)) (atoi (cadr b))) (< (atoi (car a)) (atoi (car b))))
  16.                   )
  17. )
  18.  
Title: Re: sort a list of strings
Post by: Lee Mac on July 05, 2020, 01:07:41 PM
I might suggest something along the lines of the following:
Code - Auto/Visual Lisp: [Select]
  1. (defun mysort ( l )
  2.     (mapcar '(lambda ( n ) (nth n l))
  3.         (vl-sort-i (mapcar '(lambda ( x ) (read (strcat "(" (vl-string-subst " " "x" (cadr x)) ")"))) l)
  4.            '(lambda ( a b )
  5.                 (if (= (car  a) (car  b))
  6.                     (< (cadr a) (cadr b))
  7.                     (< (car  a) (car  b))
  8.                 )
  9.             )
  10.         )
  11.     )
  12. )
Code - Auto/Visual Lisp: [Select]
  1. _$ (mysort the_list)
  2. (
  3.     ("Right Beam"    "45x35")
  4.     ("Right Beam"    "55x25")
  5.     ("Bottom Beam" "100x175")
  6.     ("Bottom Beam" "100x200")
  7.     ("Left Beam"   "150x200")
  8.     ("Left Beam"   "200x100")
  9.     ("Top Beam"    "200x150")
  10.     ("Bottom Beam"  "225x75")
  11. )
Title: Re: sort a list of strings
Post by: Coder on July 05, 2020, 02:49:39 PM
Thank you Dlanor and Lee.

Both works great.