Table des matières

lsort

Trie les éléments d'une liste

Syntaxe

lsort ?options? list

Description

Cette commande trie les éléments de list, retournant une nouvelle liste triée. L'implémentation de la commande lsort utilise l'algorithme merge-sort qui est un tri stable ayant pour performance caractéristique O(n log n).

Par défaut un tri ASCII est utilisé avec le résultat renvoyé en ordre ascendant. Néanmoins, quelconque des options suivantes peut être spécifiée avant list pour contrôler le processus de tri (les abréviations uniques sont acceptées):

Exemples

Voici la procédure lshuffle qui permet de rendre une liste aléatoire:

proc lshuffle {sorted} {
   set shuffled {}
   while { [llength $sorted] > 0} {
      set j [expr {int(rand() * [llength $sorted])}]
      lappend shuffled [lindex $sorted $j]
      set sorted [lreplace $sorted $j $j]
   }
   return $shuffled
}
set abc {a b c d e f g h i j k l m n o p q r s t u v w x y z}
puts $abc
# a b c d e f g h i j k l m n o p q r s t u v w x y z
puts [lshuffle $abc]
# k z o v j a t u q p g f l d e n c y r i w b h s x m
puts [lshuffle $abc]
# p g l x c b r y h o t j z d q w s k a v i f n u m e

Un autre exemple utilisant -index:

# list of users: nick, words, lines
set random {
   {albert 45 8}
   {hector 4 2}
   {gwenaelle 84 18}
   {myriam 64 4}
}
 
proc order {ulist {type ""}} {
   switch -nocase $type {
      words { set idx 1; set opt "-integer" }
      lines { set idx 2; set opt "-integer" }
      default { set idx 0; set opt "-nocase" }
   }
   return [lsort $opt -index $idx $::random]
}
 
puts "order by names"
foreach l [order $random] {
   puts "[lindex $l 0] as [lindex $l 1] words and [lindex $l 2] lines"
}
 
puts "order by words"
foreach l [order $random words] {
   puts "[lindex $l 0] as [lindex $l 1] words and [lindex $l 2] lines"
}
 
puts "order by lines"
foreach l [order $random lines] {
   puts "[lindex $l 0] as [lindex $l 1] words and [lindex $l 2] lines"
}

Voir aussi

list