Aller au contenu

Messages recommandés

Posté(e)

Bonjour,

 

Une liste sous cette forme


(setq &liste '(
("TitreItem1" "TitreItem2" "TitreItem3" "TitreItemx" );doit rester en premier
("Item1" "Item2" "Item3" "Itemx")
("Pierre" "Remy" "Dudul" "Nidre")
("Albert" "Trent" "Bob" "Jane")
;...
)
)

 

j'aimerai pouvoir la trier avec une fonction du genre (TriListList &liste NumeroItem <)

 

Donc trier selon les Items qui prennes la X em place dans la liste, sachant que celle qui contient les titres doit rester en premier.

Exemple

(TriListList &liste 3 <)

 

me renverrai

 

'(
("TitreItem1" "TitreItem2" "TitreItem3" "TitreItemx")
("Albert" "Trent" "Bob" "Jane")
("Pierre" "Remy" "Dudul" "Nidre")
("Item1" "Item2" "Item3" "Itemx")
)

 

Pas sur d'avoir été très clair, mais je m'en sort pas avec VL-SORT tous seul

Existe t'il une fonction toute faite (hors le maintien de la premiere liste, ça je peux m'en sortir) ?

Posté(e)

Salut,

 

En LISP, comme dans la plupart des langages de programmation les listes sont indexées sur une base 0 (le premier item a l'indice 0).

 

(defun trilistlist (l i)
 (cons
   (car l)
   (vl-sort
     (cdr l)
     '(lambda (l1 l2)
 (< (nth i l1) (nth i l2))
      )
   )
 )
)

(trilistlist &liste 2) retourne :

(("TitreItem1" "TitreItem2" "TitreItem3" "TitreItemx")
 ("Albert" "Trent" "Bob" "Jane")
 ("Pierre" "Remy" "Dudul" "Nidre")
 ("Item1" "Item2" "Item3" "Itemx")
)

 

Si tu veux vraiment un indice basé sur 1, remplace (nth i l*) par (nth (- i 1) l*) ou place un (setq i (1- i)) en début de routine.

 

Si tu veux pouvoir spécifier la fonction de tri, comme dans vl-sort :

(defun trilistlist (l i f)
 (cons
   (car l)
   (vl-sort
     (cdr l)
     '(lambda (l1 l2)
 (apply f (list (nth i l1) (nth i l2)))
      )
   )
 )
)

La fonction de tri passée en argument doit être "quotée" :

(trilistlist &liste 2 '>) ; tri décroissant

retourne :

(("TitreItem1" "TitreItem2" "TitreItem3" "TitreItemx")
 ("Item1" "Item2" "Item3" "Itemx")
 ("Pierre" "Remy" "Dudul" "Nidre")
 ("Albert" "Trent" "Bob" "Jane")
)

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Merci a tout les deux,

 

ACAD_STRLSORT , je ne connaissait pas, je ne regarde pas assez de ce coté,

je vais plus facilement vers la lettre V quand je cherche des fonctions... :rolleyes:

 

et je vois bien que j'ai encore beaucoup de progrès à faire avant de réaliser tout seul une fonction comme tu me présente Gile.

 

je n'arrive pas a en déduire l'algorithme

'(lambda (l1 l2)

 

comment les arguments sont ils renseignés???

Posté(e)

Salut,

 

acad_strlsort est une fonction de tri utilisable uniquement avec listes de chaînes, elle ne sera donc d'aucune utilité dans le cas présent où il est question de trier une liste de listes de chaînes qui plus est avec avec un critère particulier.

 

vl-sort est une fonction tri de liste plus générique qui utilise la fonction de comparaison qui lui est passée en argument. Il faut, bien sûr que les éléments de la liste soit comparables à l'aide de la fonction utilisée.

 

La fonction de comparaison peut être de tout type de fonction : prédéfinie (comme ) définie par l'utilisateur (avec (defun ...)) ou une fonction anonyme ((lambda ...)). Hormis les fonctions d'inégalité prédéfinies ( =) la fonction de comparaison doit accepter deux arguments et retourner T si le premier argument doit être placé devant le second dans la liste triée). vl-sort utilise ensuite la fonction de comparaison dans un algorithme de tri en comparant les éléments de la liste par deux.

 

Dans le cas présent la fonction anonyme (expression lambda) compare deux éléments de la liste, soit deux listes de chaînes, et évalue si le nième élément de la première sous liste est inférieur au nième élément de la seconde sous liste :

(

si c'est le cas, l'expression retourne T et le premier argument sera placé avant le second dans la liste triée, si ce n'est pas le cas (l'expression retourne nil) le second argument est placé devant le premier.

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

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
×
×
  • 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é