IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Tri Array Multidim. avec valeurs égales


Sujet :

JavaScript

  1. #1
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 65
    Points : 50
    Points
    50
    Par défaut Tri Array Multidim. avec valeurs égales
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    function tri( a, b )
    {
     
    //return a[0] - b[0];
    //ou
     
    var v1 = parseInt(a[0]);
    var v2 = parseInt(b[0]);
    if ( v1 < v2 ) return -1;
    if ( v1 > v2 ) return 1;
    return 0;
     
    }
    Mon problème:
    un tableau trié sur une clé ayant des valeurs égales ne se tri pas correctement. Souvent la clé du milieu (c'est à dire ayant pour indice la moitié du nombre d'entrées) se retrouve en tête du tableau et le reste inchangé.

    Ex:

    tableau initial

    0 => 0
    1 => 0
    2 => 0
    3 => 0
    4 => 0
    5 => 0
    6 => 0
    7 => 0
    8 => 0
    9 => 0
    10 => 0

    devient

    5 => 0
    0 => 0
    2 => 0
    3 => 0
    4 => 0
    1 => 0
    6 => 0
    7 => 0
    8 => 0
    9 => 0
    10 => 0

    Merci pour votre aide.

  2. #2
    Expert confirmé
    Avatar de RomainVALERI
    Homme Profil pro
    POOête
    Inscrit en
    Avril 2008
    Messages
    2 652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : POOête

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 652
    Points : 4 164
    Points
    4 164
    Par défaut
    Heu... deux choses que je ne comprends pas à la lecture de ton post :

    - pourquoi parler de tableau multidimensionnel ?

    - quel est le problème exactement... ? Les indices sont numériques et non pas des chaines, donc "après tri" sur un tableau dont toutes les valeurs sont à 0, le tableau a la même longueur, des indices numériques... il est identique au tableau avant le tri.... non ? A quel niveau est-ce que ça pose problème ?

  3. #3
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 65
    Points : 50
    Points
    50
    Par défaut
    Citation Envoyé par RomainVALERI Voir le message
    Heu... deux choses que je ne comprends pas à la lecture de ton post :
    - pourquoi parler de tableau multidimensionnel ?
    Tableau multidimensionnel car ... c'est l'une des utilisations spécifique à la fonction personnalisé dans un tri. Lors d'une récupération des éléments d'une BDD j'ai un tableau contenant les n entrées de ma BDD, où chacune correspond à un nouveau tableau avec toutes ses colonnes (nom, prénom, age, ...). D'où l'utilisation d'une fonction personnalisé pour faire un tri sur une colonne spécifique.

    Citation Envoyé par RomainVALERI Voir le message
    - quel est le problème exactement... ? Les indices sont numériques et non pas des chaines, donc "après tri" sur un tableau dont toutes les valeurs sont à 0, le tableau a la même longueur, des indices numériques... il est identique au tableau avant le tri.... non ? A quel niveau est-ce que ça pose problème ?
    Je reprends mon exemple précédent d'exploitation d'une BDD. Disons que nous avons :
    table[0]["sexe"] = masculin
    table[0]["prenom"] = jimmy
    table[0]["age"] = 30
    table[1]["sexe"] = masculin
    table[1]["prenom"] = romain
    table[1]["age"] = 30
    table[2]["sexe"] = masculin
    table[2]["prenom"] = bob
    table[2]["age"] = 30
    Avec un tri sur l'âge (valeur numérique) le tableau ne devrait pas changer d'état ... puisque pour les 3 entrées l'âge est égal à 30.
    OR il se trouve qu'à partir d'un certain nombre d'entrée; le tableau change d'ordre.

  4. #4
    Expert confirmé
    Avatar de RomainVALERI
    Homme Profil pro
    POOête
    Inscrit en
    Avril 2008
    Messages
    2 652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : POOête

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 652
    Points : 4 164
    Points
    4 164
    Par défaut
    Bon, ça se précise mais... pas encore tout-à-fait

    La seconde "dimension" de ton tableau est basée sur des indices numériques (ce qui, en effet, suite au comportement que tu signales, pourrait poser problème) ? Ou bien sur des clefs sous formes de chaines (le principe du tableau associatif ou hash, en fait), comme dans l'exemple que tu donnes ici :
    table[0]["sexe"] = masculin
    table[0]["prenom"] = jimmy
    table[0]["age"] = 30
    table[1]["sexe"] = masculin
    table[1]["prenom"] = romain
    table[1]["age"] = 30
    table[2]["sexe"] = masculin
    table[2]["prenom"] = bob
    table[2]["age"] = 30
    ?

    Parce que je ne vois pas en quoi l'extrait ci-dessus est différent de :
    table[0]["sexe"] = masculin
    table[0]["age"] = 30
    table[0]["prenom"] = jimmy
    table[1]["prenom"] = romain
    table[1]["sexe"] = masculin
    table[1]["age"] = 30
    table[2]["age"] = 30
    table[2]["sexe"] = masculin
    table[2]["prenom"] = bob
    ?

    Tu accèdes aux éléments de la même manière avant et après traitement, donc le problème n'est pas ici mais en aval, dans un traitement que tu dois faire après cette étape, j'imagine... ^^

    >>> Dis-nous ce que tu veux faire avec le tableau "trié" mais qui ne fonctionne pas (affichage, calcul, etc.)

  5. #5
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 65
    Points : 50
    Points
    50
    Par défaut
    C'est bien au premier niveau, c'est à dire dans le tableau principal, celui que je veux trier en fait, que ce passe mon problème.

    table[0]["sexe"] = masculin
    table[0]["prenom"] = jimmy
    table[0]["age"] = 30
    table[1]["sexe"] = masculin
    table[1]["prenom"] = romain
    table[1]["age"] = 30
    table[2]["sexe"] = masculin
    table[2]["prenom"] = bob
    table[2]["age"] = 30
    ...

    en triant table par rapport à l'âge des entrées (sous tableaux), en ayant tout les âges identiques, le tableau ne devrait pas bouger. En fait je me retrouve avec par exemple:

    table[0]["sexe"] = masculin
    table[0]["prenom"] = romain
    table[0]["age"] = 30
    table[1]["sexe"] = masculin
    table[1]["prenom"] = bob
    table[1]["age"] = 30
    table[2]["sexe"] = masculin
    table[2]["prenom"] = jimmy
    table[2]["age"] = 30
    ...
    ?

    Les valeurs, entrées, ou bien encore sous tableaux comme vous voulez, ont changé d'indice. Pourquoi?

  6. #6
    Expert confirmé
    Avatar de RomainVALERI
    Homme Profil pro
    POOête
    Inscrit en
    Avril 2008
    Messages
    2 652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : POOête

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 652
    Points : 4 164
    Points
    4 164
    Par défaut
    Je crois qu'il faudrait voir un peu de code pour s'y retrouver : montre-nous comment est appelée ta fonction de tri, avec un peu de contexte si possible

  7. #7
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 65
    Points : 50
    Points
    50
    Par défaut
    Hum... Je pensais que c'était plutôt clair

    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    function tri( a, b )
    {
    	return a[1] - b[1];
     
    	//ou
        //var v1 = parseInt(a[1]);
    	//var v2 = parseInt(b[1]);
    	//if ( v1 < v2 ) return -1;
    	//if ( v1 > v2 ) return 1;
    	//return 0;
    }
     
    var t = new Array();
     
    for(i=0; i<11; i++)
    {
    t[i] = new Array();
    t[i][0] = i;
    t[i][1] = 0;
    }
     
    for(i=0; i< t.length; i++) 
    { 
    document.writeln(t[i][0] + " => " + t[i][1] + "<br>");
    }
     
    t.sort(tri);
     
    for(i=0; i< t.length; i++) 
    { 
    document.writeln(t[i][0] + " => " + t[i][1] + "<br>");
    }
    Résultat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    0 => 0
    1 => 0
    2 => 0
    3 => 0
    4 => 0
    5 => 0
    6 => 0
    7 => 0
    8 => 0
    9 => 0
    10 => 0
    5 => 0
    0 => 0
    2 => 0
    3 => 0
    4 => 0
    1 => 0
    6 => 0
    7 => 0
    8 => 0
    9 => 0
    10 => 0
    Merci pour votre attention

  8. #8
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17 110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 110
    Points : 44 929
    Points
    44 929
    Par défaut
    Bonjour à tous,
    une chose me chagrine dans ce qui est fait...
    ...tri sur un tableau d'objet!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    table[0]["sexe"] = masculin
    table[0]["prenom"] = jimmy
    table[0]["age"] = 30
    table est un tableau de tableau associatif, donc d'objet équivalent à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    table[0].sexe = 'masculin';
    table[0].prenom = 'jimmy';
    table[0].age = 30;
    lorsque l'on appelle, je présumes
    la fonction attend en paramètre des éléments du tableau soit la première fois table[0] et table[1]

    dans la fonction on a donc ces éléments sous référence a et b, et dans ce cas utiliser a[0] et b[0] reviens à utiliser table[0][0] et table[1][0].
    comme table[0], et les autres, pointe sur un tableau associatif table[0][0] est undefined.

    Il te faut utiliser dans la fonction a.age ou encore a['age']

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function tri( a, b ){ 
      //return a[0] - b[0];
      //ou 
      var v1 = parseInt(a['age']); // possible
      var v2 = parseInt(b.age);    // autre possibilite
      if ( v1 < v2 ) return -1;
      if ( v1 > v2 ) return 1;
      return 0;
    }

  9. #9
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 65
    Points : 50
    Points
    50
    Par défaut

    Tableau d'objets ? ... Hum ... un tableau est objet. Donc tableau de tableaux ou tableau d'objets ... c'est ... pareil non ?

    Cependant pour la deuxième partie vous avez tout à fait raison, j'ai recopié et simplifié mon code un peu vite. Comme je le disais avant j'utilise de champs différents en fonction du remplissage de ma base de données. Faire ce tri avec a["age"] et b["age"] ne change pas le problème. Si les âges sont égaux le tri présente l'erreur citée plus haut. Je vais réécrire mon exemple...

  10. #10
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 65
    Points : 50
    Points
    50
    Par défaut
    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    function tri( a, b )
    {
    	return a["age"] - b["age"];
     
    	//ou
        //var v1 = parseInt(a["age"]);
    	//var v2 = parseInt(b["age"]);
    	//if ( v1 < v2 ) return -1;
    	//if ( v1 > v2 ) return 1;
    	//return 0;
    }
     
    var t = new Array();
     
    for(i=0; i<11; i++)
    {
    t[i] = new Array();
    t[i]["id"] = i;
    t[i]["nom"] = "nom" + i;
    t[i]["age"] = 50;
    }
     
    for(i=0; i< t.length; i++) 
    { 
    document.writeln(t[i]["id"] + " => " + t[i]["age"] + "<br>");
    }
     
    t.sort(tri);
     
    for(i=0; i< t.length; i++) 
    { 
    document.writeln(t[i]["id"] + " => " + t[i]["age"] + "<br>");
    }
    Résultat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    0 => 50
    1 => 50
    2 => 50
    3 => 50
    4 => 50
    5 => 50
    6 => 50
    7 => 50
    8 => 50
    9 => 50
    10 => 50
     
    5 => 50
    0 => 50
    2 => 50
    3 => 50
    4 => 50
    1 => 50
    6 => 50
    7 => 50
    8 => 50
    9 => 50
    10 => 50

  11. #11
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17 110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 110
    Points : 44 929
    Points
    44 929
    Par défaut
    le résultat que tu obtiens est celui de CHROME, les autres navigateurs sur lesquels je viens de tester rendent unanimement le tableau inchangé, avec toutefois une différence de traitement notable quant à l'ordre de passage pour l'examen des éléments.

    le script de test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    var html = "<br>";
    var i, count = 0;
    var t = [];
     
    function tri( a, b ){
      html += a["id"] + '->' + b["id"] +'<br>';
      count++;
      return a["age"] - b["age"];
    }
     
    for( i=0; i<11; i++){
      t[i] = [];
      t[i]["id"]  = i;
      t[i]["nom"] = "nom" + i;
      t[i]["age"] = 50;
    }
     
    t.sort(tri);
     
    document.write( 'Tableau en sortie<br>');
    for( i=0; i< t.length; i++){
      document.writeln(t[i]["id"] + " => " + t[i]["age"] + "<br>");
    }
    document.write( '<br>Appel fonction ', count, html);
    on passe de 49 passages sous IE à 10 pour OPERA GOOGLE et FIREFOX, SAFARI ce distingue avec 29 passages, le plus savoureux étant que pas un n'a la même méthode de sélection des éléments à passer.

    Si tu veux un rendu identique il va te falloir utiliser ta propre fonction maîtrisée

  12. #12
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 65
    Points : 50
    Points
    50
    Par défaut
    Intéressant ... Je n'avais pas pensé à changer de navigateur ... je suis tellement content de Chrome... que j'en oublie les autres

    Je développe sur Mac 10.6.7 et j'ai testé sous Chrome 11.0 Firefox 3.6 et Safari 5.0. J'ai effectivement noté la différence de passage à la fonction, ainsi que le résultat inattendu sous Chrome.

    Au début je pensais à une différence de calcul; comme le modulo qui est affecté sur les grandes valeurs en fonction des mémoires. Mais là apparemment rien à voir.

    Qu'entendez-vous par fonction maitrisée? Pensez-vous qu'une solution est envisageable?

  13. #13
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17 110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 110
    Points : 44 929
    Points
    44 929
    Par défaut
    concernant CHROME, il rend un résultat identique sur des tableaux à 1 dimension ce qui ne convient donc pas dans ton cas.

    Si il est important de conserver l'ordre original en cas d'égalité, ce qui est tout à fait louable, et compte tenu de la particularité de CHROME, il te faut peut être utiliser un tri simple par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function fctTri( tab, param){
      var i, j, temp, nb = tab.length;
      for( i= 0 ; i < nb; i++){
        for( j = i+1; j < nb; j++){
          if( tab[j][param] < tab[i][param]){
            temp = tab[j];
            tab[j] = tab[i];
            tab[i] = temp;
          }
        }
      }
    }
    avec un appel du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fctTri ( tableau, 'age'); // ou age est le champ a trier

  14. #14
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 65
    Points : 50
    Points
    50
    Par défaut RESOLU
    Merci pour votre aide. Votre exemple m'a bien aidé à comprendre comment parvenir à mes fins.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2010] TRI.Paiements avec valeurs filtrées
    Par Bobby362 dans le forum Excel
    Réponses: 0
    Dernier message: 17/01/2012, 12h23
  2. [XL-2003] Graphique avec tri par plages de valeurs
    Par johannj dans le forum Excel
    Réponses: 4
    Dernier message: 05/01/2011, 09h16
  3. array.select avec valeurs boloolean d'Oracle
    Par Javix dans le forum Ruby on Rails
    Réponses: 1
    Dernier message: 11/05/2009, 14h50
  4. Réponses: 5
    Dernier message: 10/12/2007, 15h24
  5. PB avec valeur retour array
    Par richton95 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 10/01/2006, 15h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo