The breaking up of the strings and sorting them individually and recombining them is a good trick.
Below is an example of my good coding practices (most should be able to understand the program)
I have trouble reading spaghetti code, or code with short variables names or without headers and notes.
But that is just me.
P=
Code:
;___________________________________________________________________________________________________________|
;
; Written By: Peter Jamtgaard C.E., P.E., S.E. copyright 2017 All Rights Reserved
;___________________________________________________________________________________________________________|
;
; Abstract: Function to sort a list of room numbers like "A101B" or "101C"
; Syntax: (RoomNumberSort lstRoomNumberStrings)
;___________________________________________________________________________________________________________|
;
; Command Line Functions
;___________________________________________________________________________________________________________|
;* C:TestRoom
;* Function to test sort for supplied room numbers
;___________________________________________________________________________________________________________|
;
; General Function Header List
;___________________________________________________________________________________________________________|
; Function, Arguments and Description
;* (IsAsciiNumeral intAscii)
;* Function to check is string character is a numeral
;* (RoomNumberParse strRoomNumber)
;* Function to parse a string (roomnumber) and separate letters and numerals in groups and return a list.
;* (RoomNumberSort lstRoomNumbers)
;* Function to sort list of room numbers
;* (SortListofSublistsbyItem lstOfSublists intItem)
;* Function to sort a list of sublists by Item
;* (SublistsEqualLength lstOfSublists)
;* Function to check the length of each sublist in a list of sublists
;$ Header End
;___________________________________________________________________________________________________________|
;
; Function to test sort for supplied room numbers
;___________________________________________________________________________________________________________|
(defun C:TestRoom ()
(roomnumbersort
'(("101") ("102")
("A101") ("105")
("104") ("104A")
("104AB") ("104AA")
("A104") ("A104A")
("107") ("A105"))
)
)
;___________________________________________________________________________________________________________|
;
; Function to check is string character is a numeral
;___________________________________________________________________________________________________________|
(defun IsAsciiNumeral (intAscii)(<= 48 intAscii 57))
;___________________________________________________________________________________________________________|
;
; Function to parse a string (roomnumber) and separate letters and numerals in groups and return a list.
;___________________________________________________________________________________________________________|
(defun RoomNumberParse (strRoomNumber / intAsciiOld intAsciiOld lstOfRoomNumber lstRoomNumber2 lstSublist)
(if (= (type strRoomNumber) 'LIST)
(setq strRoomNumber (car strRoomNumber))
)
(foreach intAscii (vl-string->list strRoomNumber)
(or (and (= (IsAsciiNumeral intAscii)
(IsAsciiNumeral intAsciiOld)
)
(setq lstSublist (cons intAscii lstSublist))
)
(and (setq lstOfRoomNumber (cons (reverse lstSublist) lstOfRoomNumber))
(setq lstSublist (list intAscii))
)
)
(setq intAsciiOld intAscii)
)
(setq lstOfRoomNumber (cons (reverse lstSublist) lstOfRoomNumber))
(mapcar 'vl-list->string (reverse lstOfRoomNumber))
)
;___________________________________________________________________________________________________________|
;
; Function to sort list of room numbers
;___________________________________________________________________________________________________________|
(defun RoomNumberSort (lstRoomNumbers / blnLists lstOfRoomNumbers)
(if (= (type (car lstRoomNumbers)) 'LIST) (setq lstRoomNumbers (mapcar 'car lstRoomNumbers) blnLists T))
(if (and (setq lstofRoomNumbers (mapcar 'RoomNumberParse lstRoomNumbers))
(setq lstOfRoomNumbers (SublistsEqualLength lstOfRoomNumbers))
(setq lstOfRoomNumbers (SortListOfSublistsByItem lstOfRoomNumbers 2))
(setq lstOfRoomNumbers (SortListOfSublistsByItem lstOfRoomNumbers 0))
(setq lstOfRoomNumbers (SortListOfSublistsByItem lstOfRoomNumbers 1))
(setq lstRoomNumbers (mapcar '(lambda (X)(apply 'strcat X)) lstOfRoomNumbers))
)
(if blnLists
(mapcar 'list lstRoomNumbers)
lstRoomNumbers
)
)
)
;___________________________________________________________________________________________________________|
;
; Function to sort a list of sublists by Item
;___________________________________________________________________________________________________________|
(defun SortListofSublistsbyItem (lstOfSublists intItem)
(vl-sort lstOfSublists '(lambda (X Y) (< (nth intItem X) (nth intItem Y))))
)
;___________________________________________________________________________________________________________|
;
; Function to check the length of each sublist in a list of sublists
;___________________________________________________________________________________________________________|
(defun SublistsEqualLength (lstOfSublists / intCharacters lstOfSublists2)
(if (setq intCharacters (apply 'max (mapcar 'length lstOfSublists)))
(foreach lstSublist lstOfSublists
(while (< (length lstSublist) intCharacters)
(setq lstSublist (reverse (cons "" (reverse lstSublist))))
)
(setq lstOfSublists2 (cons lstSublist lstOfSublists2))
)
)
(reverse lstOfSublists2)
)
(princ "!")
(vl-load-com)