Tri d'un tableau Javascript

Fermé
christophe - 19 févr. 2003 à 14:56
 shanks le roux de la SSF - 12 avril 2011 à 08:24
bonjour,

Voilà, je stocke dans un tableau des chiffres (1,2,...,15,16) et, une fois le tableau rempli, j'utilise la méthode Javascript : Tableau.sort()

Malheureusement, cette méthode me trie mon tableau en comparant que les premiers chiffres des valeurs... ce qui donne :

1 , 10 , 11 , 12 , 2 , 3 , 31 , 32 , 4 , ...

Vous conviendrez que ce n'est pas tout à fait l'effet recherché... Si vous connaissez la solution à ce pb, merci de m'en toucher un mot.

> Christophe
A voir également:

6 réponses

C'est easy ton pb !!!!!


C'est parceque javascript considere tes chiffres comme des char !!!!

utilise la fonction parseInt quand tu fais tes comparaison et ca devrais marcher !
2
100% d'accord avec pollux : il faut utiliser une fonction de comparaison qui sache convertir les donnees en entiers.

Car sans une fonction de comparaison specialisee (compare_entiers_func dans l'exemple), Javascript va utiliser sa fonction (interne) de comparaison de chaines de caracteres, puisque les elements du tableau sont des chaines de caracteres.
Cette fonction de comparaison interne utilise une compaison lexographique:
'11' vient avant '2', de meme que 'aa' vient avant 'b'.

Pour plus d'inormation sur les fonctions de comparaison:
https://developer.mozilla.org/fr/R%C3%A9f%C3%A9rence_de_JavaScript_1.5_Core/Objets_globaux/Array/sort

Dans l'exemple suivant, la fonction compare_entiers_func convertis donc les chaines en entiers avant des comparer.

<html>
 <head>
<script type="text/javascript">
// Le tableau non trie contenant des chaines de caracteres
var tab = ['5', '6', '12', '22', '20', '11', '9', '1', '8', '7', '11' ]

// une fonction qui compare des chaines contenant des entiers
function compare_entiers_func(a, b) {
  // Elle doit retourner :
  // -1 si a < b
  //  0 si a = b
  //  1 si a > b
  return parseInt(a) - parseInt(b)
}

// on trie le tableau en utilisant la fonction de comparaison
// pour chaines contenant des entiers:
tab.sort(compare_entiers_func)

// puis on affiche
document.write(tab.join(', '))

</script>
 <meta http-equiv="Content-Type" content="text/plain">
 </head>
 <body>
 </body>
</html>


Resultat :
1, 5, 6, 7, 8, 9, 11, 11, 12, 20, 22
0
C'est du bidouillage ca fou2dodie ;)

comment peux tu savoir que son tableau est limité a 99???

car si son tableau traite des nombre + grand... 100 sera considéré comme inférieur a 20 !!!!!

dou ta solution devient un vrai casse tete car il faut kil scan son tableau pour voir quel est le nombre comportant le + de chiffre et qu'ensuite il agisse en conséquence tout les nombres comportant moins de chiffre !!!!!

en gros -> cest a choppé un gros mal de tete !
;-)
1
autogene31 Messages postés 4 Date d'inscription vendredi 28 décembre 2007 Statut Membre Dernière intervention 29 décembre 2007 1
29 déc. 2007 à 01:28
ENCORE UNE PETITE ERREUR MAIS QUI SERAIT FATALE !

ET Donc Fonction désormais OK !!!

function trieurInt(t)
{
var mem;
var tatrier = new Array();

for(y=0;y<t.length;y++) { tatrier[y] = parseInt(t[y]); } // important !!! => typer le contenu en int entier

for(j=0;j<tatrier.length-1;j++)
{
for(k=(j+1);k<tatrier.length;k++)
{
if(tatrier[j]>tatrier[k])
{
mem = tatrier[j];
tatrier[j]=tatrier[k];
tatrier[k]=mem;
}
}
}


return tatrier;
}
1
fou2dodie Messages postés 605 Date d'inscription mercredi 6 juin 2001 Statut Membre Dernière intervention 29 août 2006 33
19 févr. 2003 à 16:04
ou alors tu écris 01, 02, 03,...09 au lieu de 1,2,3,....,9
ça marche aussi normalement

LMCT

All I know is I’m in love  
with someone who loves me too
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
autogene31 Messages postés 4 Date d'inscription vendredi 28 décembre 2007 Statut Membre Dernière intervention 29 décembre 2007 1
28 déc. 2007 à 23:32
<script language='javascript'>

var tab = new Array(5,3,1,4,2);
var memind;

// passer le tableau en parametre
function trieurInt(t)
{
var mem;
var tatrier = new Array();

for(y=0;y<t.length;y++) { tatrier[y] = t[y]; } // copie du tableau et pas de la reference !

for(j=0;j<tatrier.length-1;j++)
{
for(k=(j+1);k<tatrier.length;k++)
{
if(tatrier[j]>tatrier[k])
{
mem = tatrier[j];
tatrier[j]=tatrier[k];
tatrier[k]=mem;
}
}
}

return tatrier;
}



function main()
{
var res = "";
var ori = "";
var tabfin = trieurInt(tab);

ori = tab.toString();

res = tabfin.toString();

alert("ori: "+ori + "\n" + "res: "+res);
}

main();

</script>

// fin de ce que les anciens appelait le trie à bulles

+ une petite reference : https://fr.wikipedia.org/wiki/Tri_%C3%A0_bulles
0
autogene31 Messages postés 4 Date d'inscription vendredi 28 décembre 2007 Statut Membre Dernière intervention 29 décembre 2007 1
28 déc. 2007 à 23:37
// fin de ce que les anciens !appelaient! le trie à bulles

désolé... // fin de ce que les anciens appelaient l'orthographe... ;-)
0