Desorganisé un tableau : la méthode sort

Soyez le premier à donner votre avis sur cette source.

Snippet vu 13 664 fois - Téléchargée 27 fois

Contenu du snippet

J'avais besoin recemment de desorganiser un tableau.

Par exemple j'avais

var tableau = new Array(0, 1, 2, 3, 4, 5);

et je voulais une fonction qui me mélange les nombres. En gros que {0, 1, 2, 3, 4, 5} deviennent {4, 3, 5, 0, 2, 1}

Pour cela j'ai utilisé la méthode sort de l'objet Array. Cette méthode attend en paramètre une fonction qui elle prend en paramètre 2 elements, puis cette fonction doit retourner un nombre negatif si la premier paramètre est inferieur au 2eme, 0 s'ils sont égaux, et un nombre supérieur à 1 s'il le premier est supérieur au second.

regardons un exemple :

tableau.sort(
function(elmt1, elmt2)
{
if (elmt1 < elmt2)
return -1;
else if( elmt1 == elmt2)
return 0;
else
return 1;
}
)

Donc pour desorganiser le tableau il faut que je retourne soit -1 soit 1. Voici le code permettant de faire ca : return ((2 * Math.round(Math.random())) - 1)

Une fois integré dans la fonction cela donne

tableau.sort(function(elmt1, elmt2) { return ((2 * Math.round(Math.random())) - 1) });

Le problème c'est que cette fonction n'est pas réutilisable il vous faut faire un copier coller pour desorganisé le tableau :/

C'est pas bien grave, etendons l'objet Array et rajoutons lui la méthode sortRandom()

if (!Array.prototype.sortRandom)
Array.prototype.sortRandom = function() { this.sort(function(elmt1, elmt2) { return ((2 * Math.round(Math.random())) - 1) }); }

Placer ce bout de code au début de votre fichier js, et vous pouvez dorenavant faire

var tableau = new Array(0, 1, 2, 3, 4, 5);
tableau.sortRandom();

alert(tableau[0]); // me renverra au hasard un des 6 chiffres du dessus.

Un autre problème c'est que ma méthode sortRandom modifie le tableau d'origine, et moi je voudrais bien que cela me renvoie un nouveau tableau.

Donc déjà il nous faut une fonction qui permet la duplication d'un tableau, on procede de la meme facon que tout à l'heure, en etendant l'objet Array.

if (!Array.prototype.duplicate)
Array.prototype.duplicate = function() { return [].concat(this);}

maintenant ajoutons la méthode getRandomlySort

if (!Array.prototype.getRandomlySort)
Array.prototype.getRandomlySort= function() { return this.duplicate().sortRandom();}

Source / Exemple :


if (!Array.prototype.duplicate) 
    Array.prototype.duplicate = function() { return [].concat(this);}

if (!Array.prototype.sortRandom) 
    Array.prototype.sortRandom = function() { this.sort(function(elmt1, elmt2) { return ((2 * Math.round(Math.random())) - 1) }); }

if (!Array.prototype.getRandomlySort) 
    Array.prototype.getRandomlySort= function() { return this.duplicate().sortRandom();}

Conclusion :


J'ai fait ces fonctions pour vous montrer le fonctionnement de la méthode sort :)

A voir également

Ajouter un commentaire

Commentaires

Messages postés
1
Date d'inscription
samedi 24 mars 2007
Statut
Membre
Dernière intervention
10 juin 2010

Hum... oui on peut procéder ainsi, mais comme le signale tcherniatinsky, ça n'est pas un tri réellement aléatoire.

Éventuellement on peut utiliser la méthode suivante :

var tableau = new Array(0, 1, 2, 3, 4, 5);

function sortRandom(){
var copie = new Array().concat(tableau);

var taille = tableau.length;
for(var i=0; i<tableau.length; i++, taille--)
{
var elm = Math.floor(Math.random()*taille);
tableau.push(tableau[elm]);
tableau[elm] = tableau[0];
tableau.shift();
}
}

Cette fonction, après avoir copié le contenu du tableau dans "copie" :
-Sélectionne une case au hasard
-Ajoute son contenu à la fin du tableau
-Remplace cette case par le contenu de la première case
-Supprime la première case du tableau

Ainsi, on modifie le tableau initial d'une façon totalement aléatoire.
Messages postés
1
Date d'inscription
lundi 21 décembre 2009
Statut
Membre
Dernière intervention
21 décembre 2009

Il y a une erreur dans le tri.
En effet la fonction sort va prendre le premier élément et le comparer au second.
S'il est plus grand on le compare au troisième et ainsi de suite.
Or le résultat de la comparaison a une chance sur deux d'être négatif.
Ce qui fait que ce premier élément a une chance sur deux d'être en première position, une sur quatre d'être en deuxième position, une sur huit d'être en troisième position,1/16...
Une solution originale est de permuter les éléments du tableau en les choisissant au hasard.
On choisit deux nombres aléatoires compris entre 0 et la taille tu tableau-1
on permute les éléments du tableau correspondant à ces indices.
On fait tourner la onction un certain nombre de fois afin que tous les éléments aient pu être mélangés.
Une autre solution serait de piocher dans le tableau un élément dont l'indice est choisi au hasard et de le mettre à la fin d'un nouveau tableau; on l'enlève de notre tableau et on repioche un élément jusqu'à ce que le tableau soit vide.
Messages postés
289
Date d'inscription
vendredi 11 mars 2005
Statut
Membre
Dernière intervention
3 avril 2008
3
Salut jesusonline,

Juste une petite précision concernant ta source. Tu dis que la fonction n'est pas réutilisable lorsqu'elle est utilisé directement dans le sort(). Et c'est effectivement vrai sauf qu'il n'est pas nécessaire de mettre la fonction dans le sort. Il sufit de l'appeler avec son nom. Un exemple :

function sortRandom(elmt1, elmt2)
{
return ((2 * Math.round(Math.random())) - 1)
}

var tableau = new Array(0, 1, 2, 3, 4, 5);
// pour faire la copie
copie = new Array().concat(tableau)
// pour trier
tableau.sort(sortRandom);

alert(tableau);
alert(copie)


Donc le prototypage n'étaient pas nécessaire pour ne pas avoir a dupliquer la fonction. C'était tout de même un bon exercice de ta part.

9/10

A+
Messages postés
97
Date d'inscription
mardi 9 avril 2002
Statut
Membre
Dernière intervention
11 mai 2008

Simple, peu long, détaillé, très bonne source pour découvrir un peu plus le language :)
Félicitation
Messages postés
15
Date d'inscription
lundi 16 août 2004
Statut
Membre
Dernière intervention
14 septembre 2007

Un bon tutorial qui depasse le cadre du sort et permet de montrer à ceux qui ne le save pas comment étendre les classes de base du javascript sans forcement faire de la délégation.

Fred

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.