begin process at 2012 02 12 03:04:00
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Tutoriaux

 > DESORGANISÉ UN TABLEAU : LA MÉTHODE SORT

DESORGANISÉ UN TABLEAU : LA MÉTHODE SORT


 Information sur la source

Note :
8,5 / 10 - par 4 personnes
8,50 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Tutoriaux Classé sous :mélanger, shuffle, array, sort, trier Niveau :Débutant Date de création :24/08/2005 Date de mise à jour :24/08/2005 21:41:03 Vu :11 416

Auteur : jesusonline

Ecrire un message privé
Site perso
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (5)
Ajouter un commentaire et/ou une note


 Description

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

  • 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();}
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 :)


 Historique

24 août 2005 21:41:03 :
-

 Sources du même auteur

IMPLÉMENTATION DU TYPE GUID AVEC MICROSOFT AJAX
Source avec Zip CHRONOMÈTRE MESURANT LA DURÉE D'UNE FONCTION
Source avec Zip Source avec une capture GADGET POUR VISTA : CPU GRAPH
FUNCTION.WAITFOR : ATTENDRE UNE CONDITION AVANT D'EXECUTER U...
FONCTION GETELEMENTSBYCLASS

 Sources de la même categorie

Source avec Zip POUR LES DÉBUTANTS EN JAVASCRIPT par lecurieux41
CALCULER LA DISTANCE ENTRE DEUX ADRESSES DE FORMULAIRE GRÂCE... par nebenobo
Source avec Zip RÉCEPTION DE SMS EN JAVASCRIPT par hhoareau
APPELER, UN NUMÉRO DE TÉLÉPHONE GRÂCE À UNE ICÔNE SUR L'ÉCRA... par Rainbow
Source avec Zip Source avec une capture CSS3 TRANSFORM par kazma

 Sources en rapport avec celle ci

Source avec Zip REQUÊTE DE TYPE SQL SUR UN OBJET JAVASCRIP COMPLEXE par emericv
Source avec Zip PSEUDO CLASS JAVASCRIPT PERMET LE STORAGE(HTML5) D'UN TABLEA... par Magelo
CHRONOMÉTRE EN JAVASCRIPT par simo5963
TRANSFORMER UN TABLEAU JAVASCRIPT EN UN TABLEAU HTML par pifou25
Source avec Zip TRI DE TABLEAUX HTML par coucou747

Commentaires et avis

Commentaire de ze_fred le 25/08/2005 09:56:49

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

Commentaire de zeratul67 le 25/08/2005 21:23:11

Simple, peu long, détaillé, très bonne source pour découvrir un peu plus le language :)
Félicitation

Commentaire de GhislainLavoie le 30/08/2005 01:50:06

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+

Commentaire de tcherniatinsky le 21/12/2009 13:34:33

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.

Commentaire de Sadlyness78 le 10/06/2010 15:34:59

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.

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

sort Array [ par Larwin ] Bonjour tout le monde. Je me casse la tête depuis une petit moment, j'explique le problème. genre en simplifiant pour mieux comprendre : blabla = fu passer 2 tableau en url en javascript [ par CODE MAN ] Bonjour,j'ai une fonction qui permet de récupérer les positionY et positionX de tout mes div. la fonction retourne un tableau contenant l'ID_DIV, posi code javascript qui marche sur IE mais pas sur FF [ par justmix ] bonjour je suis débutant en java script et je cherche une solution a ce Problème voila mon Code :la Partie qui marche pas c'est quand tu choisi une zo JS: double boucle et compatibilité... [ par Doluvic400 ] Bonjour, A force de travail j'ai élaborer (en piquant des bouts par ci par la) un script permettant d'avoir de joli couleurs sur les carrés de liste Creer des couples depuis un Array d'objets [ par yanomano ] Bonjour, Je suis eu peu débutant en Javascript et je bute un peu sur un script. J'ai un Array avec plusieurs objets du type : [{1:2,3,},{10:11,12}] je Comment ajouter un lien sur des images qui défilent? [ par magatha ] Bonjour, J'espère poser ma question dans le bon endroit. J'ai trouvé un script sympa de rotation d'images (mieux qu'un simple ), et je voudrez que JS: Mettre du code Html dans un Array ? [ par benjouk ] Bonjour, Après des recherches infructueuses dans l'aide de Dreamweaver et sur le web, je n'ai pas trouvé de réponse à mon interrogation, qui me par Séparer entètes et tableau [ par bydouille ] Bonsoir à tous, J'ai fait un tri dynamique de tableau HTML avec le DOM Mon tableau s'affiche dans un div avec un overflow Quand le nombre de ligne Array, Enelver élément indexé par une chaine [ par dark_naruto25 ] Bonjour à tous, J'utilise un Array pour garder des objets DOM. Pour retrouver ces éléments, j'utilise un indexage par String. Déjà qu'il n'est pas pos


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,593 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales