Tri d'un tableau Javascript

[Fermé]
Signaler
-
 shanks le roux de la SSF -
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

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
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 42674 internautes nous ont dit merci ce mois-ci

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
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 !
;-)
Messages postés
4
Date d'inscription
vendredi 28 décembre 2007
Statut
Membre
Dernière intervention
29 décembre 2007
1
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;
}
Messages postés
605
Date d'inscription
mercredi 6 juin 2001
Statut
Membre
Dernière intervention
29 août 2006
33
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
Messages postés
4
Date d'inscription
vendredi 28 décembre 2007
Statut
Membre
Dernière intervention
29 décembre 2007
1
<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
Messages postés
4
Date d'inscription
vendredi 28 décembre 2007
Statut
Membre
Dernière intervention
29 décembre 2007
1
// fin de ce que les anciens !appelaient! le trie à bulles

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