Ranger des mots par ordre alphabétique

Contenu du snippet

Ce code permet de classer des mots par ordre alphabétique
C'estune astuce qui montre en gros comment fonctionne le rangement des fenetre utilisateur en mode +S ou les list avec l'option sort

Fait exactement le meme boulot que $sorttok mais ce code permet de voir comment ça marche et surtout il montre un bel exemple d'utilisation des hash table
C'est une astuce qui peut servir dans de nombreux codes quand on veut notament implémenter deux while pour comparer un mot a une liste de mot ...

Source / Exemple :


alias -l asc1 { if (!$1) { return 0 } | else { return $asc($1) } }
alias -l m { if ( $1 >= $2 ) { return $1 } | else { return $2 } }
alias -l compare {
  set %itr 1 
  while ( %itr <= $m($len($1),$len($2)) ) {
    if ( $asc1($mid($1,%itr,1)) > $asc1($mid($2,%itr,1)) ) { return $2 | goto fin }
    elseif ( $asc1($mid($1,%itr,1)) < $asc1($mid($2,%itr,1)) ) { return $1 | goto fin }
    elseif ( $asc1($mid($1,%itr,1)) = $asc1($mid($2,%itr,1)) ) { inc %itr }
  }
  if ( %itr = $calc($m($len($1),$len($2)) +1) ) { return $1 }
  :fin
}

alias trier { 
  var %resultat = $gettok($1-,1,32) z
  var %i1 = 2
  while ( %i1 <= $gettok($1-,0,32) ) {
    var %i2 = 1
    while ( %i2 <= $gettok(%resultat,0,32) ) {
      if ( $compare($gettok($1-,%i1,32),$gettok(%resultat,%i2,32)) = $gettok($1-,%i1,32) ) { 
        %resultat = $instok(%resultat,$gettok($1-,%i1,32),%i2,32) | %i2 = $gettok(%resultat,0,32)
      }
      inc %i2
    }
    inc %i1
  }
  return $gettok(%resultat,1- $+ $calc($gettok(%resultat,0,32) -1),32)
}

alias trier2 { 
  if ( $hget(ordre).size ) { hfree ordre }
  hadd -m ordre resultat $gettok($1-,1,32) z
  hadd -m ordre i1 2
  while ( $hget(ordre,i1) <= $gettok($1-,0,32) ) {
    hadd -m ordre i2 1
    while ( $hget(ordre,i2) <= $gettok($hget(ordre,resultat),0,32) ) {
      if ( $compare($gettok($1-,$hget(ordre,i1),32),$gettok($hget(ordre,resultat),$hget(ordre,i2),32)) = $gettok($1-,$hget(ordre,i1),32) ) { 
        hadd -m ordre resultat $instok($hget(ordre,resultat),$gettok($1-,$hget(ordre,i1),32),$hget(ordre,i2),32) 
        hadd -m ordre i2 $gettok($hget(ordre,resultat),0,32)
      }
      hinc ordre i2
    }
    hinc ordre i1
  }
  return $gettok($hget(ordre,resultat),1- $+ $calc($gettok($hget(ordre,resultat),0,32) -1),32)
}

Conclusion :


pour mettre par ordre alphabétique faire :
$trier(mot1 mot2 ... motN) ou
$trier2(mot1 mot2 ... motN)

ya un petit problème quand la chaîne de caractère est constitué par des chiffres.. je vous laisse le découvrir. Avec les mots ça marche impeccablement

Merci a Sorn_Drixer pour l'idée

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.