Aller au contenu

[Résolu] Petit soucis de tri d'une liste avec "vl-sort".


DenisHen
 Partager

Messages recommandés

Bonjour à la communauté.
Je tente de trier une liste par ordre croissant :

(setq ListTS (vl-sort ListTS '<))

Dans ma liste, je peut avoir "1;ST" "10;ST" "2;ST"...
Le problème est qu'à la sortie du tri, j'ai "10;ST" "1;ST" "2;ST"...
Je préfèrerais avoir "1;ST" "2;ST" "10;ST", avec le 10 plus grand que 1 et 2...

Si quelqu'un a une astuce, un conseil...
Denis.

Windows 10 Pro 64bits / AutoCAD 3D 2022

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).

Lien vers le commentaire
Partager sur d’autres sites

Coucou Luna et merci pour ton aide.
J'ai tenté ton code :

  (setq ListTS (vl-sort ListTS
                        '(lambda (s1 s2 / x1 x2)
                           (if (= (setq x1 (substr s1 5 13))
                                  (setq x2 (substr s2 5 13))
                               ) ;_ Fin de =
                             (< (substr s1 (- (strlen s1) 5))
                                (substr s2 (- (strlen s2) 5))
                             ) ;_ Fin de <
                             (< x1 x2)
                           ) ;_ Fin de if
                         ) ;_ Fin de lambda
               ) ;_ Fin de vl-sort
  ) ;_ Fin de setq

Mais à la sortie du tri, j'ai "2;ST" "1;ST" "10;ST"...
J'aurais peut-être du préciser que les éléments de la liste sont plus long que ça, ils ressembleraient plus à :
("1;ST25C;600;240" "10;ST25C;450;240" "2;ST25;200;240" .....)

Windows 10 Pro 64bits / AutoCAD 3D 2022

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

Pour compléter la réponse complète de @Luna sur le sujet.

Je ferais remarquer que pour simplifier le code, dans le cas présent tes chaines de caractère sont "systématiquement" NumériqueAlpha et non AlphaNumérique (en ce qui concerne ton critère de trie)

Tu peux tenter la ligne de code suivante au moyen de la fonction read:

(vl-sort ListTS '(lambda (e1 e2) (< (read e1) (read e2))))

Cdt Bruno

Apprendre => Prendre => Rendre

Lien vers le commentaire
Partager sur d’autres sites

Bonjour Bruno et mille mercis pour ton aide, ça fonctionne parfaitement.
Encore merci.

Windows 10 Pro 64bits / AutoCAD 3D 2022

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).

Lien vers le commentaire
Partager sur d’autres sites

Coucou,

Vui c'est un peu le problème, c'est qu'il est difficile de trouver une solution généralisée pour ce genre de soucis...
La réponse de @VDH-Bruno semble parfaite pour ton cas, mais dans le cas où le premier élément est présent dans plusieurs chaînes de caractères, le tri sera moins efficient. Vu la structure, j'aurais fais le tri via un (str2lst) pour comparer chaque premier élément de la liste de retour, puis le second si équivalent, etc...
Mais je reconnais que le jour où je met la main sur une fonction de tri généralisée capable de gérer n'importe quelle structure de chaîne de caractères pour la trier correctement d'un point de vue alphanumérique, chat sera du pain béni à mes yeux !!

Bisous,
Luna

Lien vers le commentaire
Partager sur d’autres sites

Merci à vous deux pour votre aide...

Windows 10 Pro 64bits / AutoCAD 3D 2022

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).

Lien vers le commentaire
Partager sur d’autres sites

il y a 4 minutes, Luna a dit :

Coucou,

Vui c'est un peu le problème, c'est qu'il est difficile de trouver une solution généralisée pour ce genre de soucis...
La réponse de @VDH-Bruno semble parfaite pour ton cas, mais dans le cas où le premier élément est présent dans plusieurs chaînes de caractères, le tri sera moins efficient. Vu la structure, j'aurais fais le tri via un (str2lst) pour comparer chaque premier élément de la liste de retour, puis le second si équivalent, etc...
Mais je reconnais que le jour où je met la main sur une fonction de tri généralisée capable de gérer n'importe quelle structure de chaîne de caractères pour la trier correctement d'un point de vue alphanumérique, chat sera du pain béni à mes yeux !!

Bisous,
Luna

Oui tout fait d'accord j'ai répondu avec la ligne de code basé sur le premier msg de @DenisHen,  cette ligne trie en fonction des quantitatifs de TS, mais ne prend pas en compte le dimension de panneau de TS, comme dans le deuxième message de  @DenisHen dans ce cas il faut découper la chaine avec la fonction (str2lst) de @(gile), puis effectuer le trie

Apprendre => Prendre => Rendre

Lien vers le commentaire
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
 Partager

×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité