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 :

Trier tableau qui stocke le nombre de caractères d'une phrase


Sujet :

JavaScript

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2013
    Messages
    165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2013
    Messages : 165
    Points : 0
    Points
    0
    Par défaut Trier tableau qui stocke le nombre de caractères d'une phrase
    Bonjour,

    Je dois faire le compte de caractère alphanumérique d'une string que je stocke dans un tableau, puis trier ce tableau en mettant les lettres les plus fréquentes en premier, puis triées par ordre alphabétique.

    J'ai donc réussi à faire le compte, mais je bloque au niveau du tri, avec la fonction sort() j'ai rien, et quand je fais tab.length, il me retourne 0.

    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
    var str = "Je ne sais pas ce que je fais ici.";
    str = str.toLowerCase(); 				// on minifie chaque caractere
    str = str.replace(/[^A-Za-z0-9]/g, '');	// on enleve tout caractère non alpha-numérique
     
    // Boucle pour compter chaque lettre
    var tab = []; // tab pour stocker les lettres
     
    for (var i = 0; i < str.length; ++i) {
        // On prend chaque caractère 1 à 1
        var ch = str.charAt(i);
     
        count = tab[ch]; // on stocke la lettre dans le tab si elle n'existe pas encore
     
        // Condition: si la lettre existe, on ajoute 1 au compte
        tab[ch] = count ? count + 1 : 1;
    }
     
    // on trie le tab
    tab.sort(function(a, b){return b-a});
     
    // on affiche
    for (ch in tab) {
        document.getElementById("resultat").innerHTML += "nombre de " + ch + " : " + tab[ch] + "<br>";
    }
    Merci de votre lecture.

  2. #2
    Rédacteur

    Avatar de autran
    Homme Profil pro
    Développeur Java
    Inscrit en
    Février 2015
    Messages
    1 241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2015
    Messages : 1 241
    Points : 7 653
    Points
    7 653
    Billets dans le blog
    55
    Par défaut
    Citation Envoyé par pito2901 Voir le message
    Je dois faire le compte de caractère alphanumérique d'une string que je stocke dans un tableau, puis trier ce tableau en mettant les lettres les plus fréquentes en premier, puis triées par ordre alphabétique.
    Tu dois trier par ordre alphabétique ou par fréquence d'apparition ?
    Ou peut-être faire 2 tableaux : un trié suivant les fréquences et l'autre par ordre alphabétique ?
    Développeur Java
    Site Web

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2013
    Messages
    165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2013
    Messages : 165
    Points : 0
    Points
    0
    Par défaut
    D'abord mon tableau doit contenir le nombre de chaque lettre :

    'je suis la' donnera le tableau :

    - j : 1
    - e : 1
    - s : 2
    - u : 1
    ...

    il faut ensuite que mon tableau affiche par fréquence :
    - s : 2
    - j : 1
    - e : 1
    - u : 1
    ...

    puis dans le même temps, trier par ordre alphabétique :
    - s : 2
    - e : 1
    - j : 1
    - u : 1
    ...

    J'espère être clair, si vous ne comprenez pas, n'hésitez pas à demander plus de détails...

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 959
    Points : 44 122
    Points
    44 122
    Par défaut
    Bonjour,
    ce qui m'interpelle c'est quand même cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    count = tab[ch]; // on stocke la lettre dans le tab si elle n'existe pas encore
    le commentaire ne colle pas avec l'action !

    Tu aurais peut être intérêt à ordonner ta chaine avant de la traiter, par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    var str = "Je ne sais pas ce que je fais ici.";
    str = str.toLowerCase(); 				// on minifie chaque caractere
    str = str.replace(/[^A-Za-z0-9]/g, '');			// on enleve tout caractère non alpha-numérique
     
    // split -> transforme en tableau
    // sort -> tri le tableau
    // join -> recrée une chaine de caractère
    str = str.split('').sort().join('');
    Tu pourrais même faire ton traitement directement sur le tableau tab_str = str.split('').sort().

  5. #5
    Modérateur

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 959
    Points : 44 122
    Points
    44 122
    Par défaut
    J’ajoute, pas bien regardé le premier coup, que comme tu travailles avec un objet la boucle for (ch in tab) parcours les propriétés par ordre alphabétique. Il te faut donc changer ta façon de stocker les données ou de les mettre dans un Array et de faire le tri sur cet Array.
    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
    // transfert des données pour tri
    var data = [];
    for (var ch in tab) {
        data.push({
            'car': ch,
            'nbr': tab[ch]
        });
    }
    // on trie les data
    data.sort(function(a, b) {
        return b.nbr - a.nbr
    });
    // affichage
    for (var i = 0, nb = data.length; i < nb; i += 1) {
        document.getElementById("resultat").innerHTML += "nombre de " + data[i].car + " : " + data[i].nbr + "<br>";
    }

  6. #6
    Rédacteur

    Avatar de autran
    Homme Profil pro
    Développeur Java
    Inscrit en
    Février 2015
    Messages
    1 241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2015
    Messages : 1 241
    Points : 7 653
    Points
    7 653
    Billets dans le blog
    55
    Par défaut
    Citation Envoyé par NoSmoking Voir le message
    Tu pourrais même faire ton traitement directement sur le tableau tab_str = str.split('').sort().
    Et meme :
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    str = str.toLowerCase().replace(/[^a-z0-9]/g, '').split('').sort().join('');
    Développeur Java
    Site Web

  7. #7
    Rédacteur

    Avatar de autran
    Homme Profil pro
    Développeur Java
    Inscrit en
    Février 2015
    Messages
    1 241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2015
    Messages : 1 241
    Points : 7 653
    Points
    7 653
    Billets dans le blog
    55
    Par défaut
    Citation Envoyé par pito2901 Voir le message
    J'espère être clair, si vous ne comprenez pas, n'hésitez pas à demander plus de détails...
    Je vois que tu utilises ce que tu dois appeler des tableaux associatifs.
    A mon avis ce serait plus rapide avec des tableaux basiques constitués d'éléments chacun repéré par un indice.
    Tu en aurais besoin de 2, un tableau de caractères et un tableau de fréquences. Caractères et fréquences mis en cohérences par leurs indices.
    Développeur Java
    Site Web

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2013
    Messages
    165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2013
    Messages : 165
    Points : 0
    Points
    0
    Par défaut
    La méthode de NoSmoking est celle que je souhaité, je ne connaissais pas la méthode avec push();

    Merci à vous !

  9. #9
    Modérateur

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 959
    Points : 44 122
    Points
    44 122
    Par défaut
    Citation Envoyé par autran
    str = str.toLowerCase().replace(/[^a-z0-9]/g, '').split('').sort().join('');
    sinon on peut ne pas traiter les espaces
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    str = str.replace(/[^a-z0-9]/g, '').toLowerCase().split('').sort().join('');

  10. #10
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Points : 22 933
    Points
    22 933
    Billets dans le blog
    125
    Par défaut
    Pour le fun (puisque résolu) et au bénéfice des lecteurs de cette discussion, version tenant compte des accents.

    1) Avec le JS d'aujourd'hui (Version ES2015) :

    Code javascript : 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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    let
      charFrequency = function( aSortTable ){
        let
          nb = aSortTable.length - 1,
          tri = [],
          tmp = '',
          n = 0;
     
        for ( let [ i, item ] of aSortTable.entries() ){
          if ( item === tmp ) {
            ++n;
          } else {
            if ( tmp != '' && n > 0 ){
              tri.push( [ tmp, n ] );
              tmp = '';
              n = 0;
            }
     
            tmp = item;
            ++n
     
            if ( i === nb  ) {
              tri.push( [ tmp, n ] );
            }
          }
        }
     
        return tri;
      },
      sortTable = function( table, ordre, bcp47String ){
        let
          bcpStr = bcp47String || "fr-BE",
          ctor = new Intl.Collator( bcpStr, { "numeric" : true } ),
          n = ( ordre === "desc" ) ? ( -1 ) : ( 1 );
     
        table.sort( function( a, b ){
            return n * ctor.compare( a, b );
        });
     
        return table;
      },
      str = `Dans une acception courante, l'accent est une particularité de diction d'un locuteur dans une langue donnée.
      Il est propre à une région ou un milieu social et peut se caractériser par des modifications du débit,
      de la prononciation, de l'intonation, de la prosodie en général.
     
      L'accent en linguistique implique d'une manière remarquable le lexique, ainsi que des renforcements ou des altérations
      grammaticales et phonétiques. Il permet de différencier des mots, des phrases et des textes. En ce sens, les différences
      d'accents expliquent les variétés régionales du français.
     
      L'accent peut aussi indiquer un caractère phonétique précis. Cela concerne :
      l'accent phonétique, ou élévation de la hauteur (accent de hauteur), notamment en latin avant le changement de son système vocalique.
      l'accent tonique, ou augmentation de l'intensité vocale (ou accent d'intensité).
      l'accent diacritique pour les accents graphiques (accent aigu, accent circonflexe, accent grave, etc.).`,
      tabChar = sortTable( str.toLowerCase().replace( /[^A-Za-z0-9àáâãäåòóôõöøèéêëçìíîïùúûüÿñ]/g, '').split('') ),
      tabFrequency = charFrequency( tabChar );
     
    console.log( str );
     
    for ( let item of tabFrequency ){
      console.log( item[0], item[1] );
    };

    2) Version ES5

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

  11. #11
    Rédacteur

    Avatar de autran
    Homme Profil pro
    Développeur Java
    Inscrit en
    Février 2015
    Messages
    1 241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2015
    Messages : 1 241
    Points : 7 653
    Points
    7 653
    Billets dans le blog
    55
    Par défaut
    Citation Envoyé par NoSmoking Voir le message
    sinon on peut ne pas traiter les espaces
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    str = str.replace(/[^a-z0-9]/g, '').toLowerCase().split('').sort().join('');
    Ouai j'aurais dû passer un jeu de tests plus étendus
    Mais du coup faut rallonger la regex pour prendre les majuscules EDIT : nouveau jeu de tests passé, les espaces sont traités avec ma sol supra
    Développeur Java
    Site Web

  12. #12
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Points : 22 933
    Points
    22 933
    Billets dans le blog
    125
    Par défaut
    Amélioration de la prise en compte des caractères spéciaux.

    Je traite un texte généré par Lorem ipsum générateur avec accents et caractères spéciaux français.

    Voir : http://www.developpez.net/forums/blo...teres-d-texte/.

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

  13. #13
    Membre expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 873
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 873
    Points : 3 717
    Points
    3 717
    Par défaut
    Salut,

    C'est un exercice intéressant... Et justement il est du même principe que celui auquel je pensais, au lieu des lettres d'une phrase c'est les mots d'un texte.

    J'ai essayé de comprendre vos explications... J'aimerais essayer de le faire...

    Mais j'aurais une question comment feriez-vous si on ne vous imposait rien (pas obliger d'utiliser un tableau et le trier par exemple, ce qui me semble une bonne idée au passage) ? Quel serait le plus efficace ?

    Citation Envoyé par NoSmoking Voir le message
    Tu aurais peut être intérêt à ordonner ta chaine avant de la traiter, par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    var str = "Je ne sais pas ce que je fais ici.";
    str = str.toLowerCase();                 // on minifie chaque caractere
    str = str.replace(/[^A-Za-z0-9]/g, '');            // on enleve tout caractère non alpha-numérique
     
    // split -> transforme en tableau
    // sort -> tri le tableau
    // join -> recrée une chaine de caractère
    str = str.split('').sort().join('');
    Tu pourrais même faire ton traitement directement sur le tableau tab_str = str.split('').sort().
    Merci, je ne connaissais pas ces fonctions, je les découvre, je les ai testées... C'est intéressant.

    Citation Envoyé par NoSmoking Voir le message
    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
    // transfert des données pour tri
    var data = [];
    for (var ch in tab) {
        data.push({
            'car': ch,
            'nbr': tab[ch]
        });
    }
    // on trie les data
    data.sort(function(a, b) {
        return b.nbr - a.nbr
    });
    // affichage
    for (var i = 0, nb = data.length; i < nb; i += 1) {
        document.getElementById("resultat").innerHTML += "nombre de " + data[i].car + " : " + data[i].nbr + "<br>";
    }
    Là je n'ai pas compris, comment est obtenu le tableau tab contenant apparemment le nombre d’occurrences de chaque lettre ?

    J'ai voulu le faire (et le remplissage du tableau data se fait dans la même boucle) et j'ai obtenu cela :

    Code javascript : 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
     
    var str = "Je ne sais pas ce que je fais ici.";
    str = str.toLowerCase();                 
    str = str.replace(/[^A-Za-z0-9]/g, '');  
    str = str.split('').sort();
     
    var data = [];
    for(i = 1, ch = str[0], compte=1 ; i<str.length; i++){
     
      if (str[i]===ch) {compte++; continue;}   
     
      data.push({
            'car': ch,
            'nbr': compte
        });
     
      ch = str[i];
      compte = 1 ;          
    }
    J'ai repris le début et aussi le "data.push({'car': ch,'nbr': compte});"...

    Citation Envoyé par autran Voir le message
    Je vois que tu utilises ce que tu dois appeler des tableaux associatifs.
    A mon avis ce serait plus rapide avec des tableaux basiques constitués d'éléments chacun repéré par un indice.
    Tu en aurais besoin de 2, un tableau de caractères et un tableau de fréquences. Caractères et fréquences mis en cohérences par leurs indices.
    C'est un bon exercice ! J'aimerais aussi le faire en Java mais cela me semble moins souple que JS (sauf si on fait comme tu proposes) ?...

    Ce que tu proposes nous éviterait d'utiliser cette fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    // on trie les data
    data.sort(function(a, b) {
        return b.nbr - a.nbr
    });
    Je devine ce qu'elle fait mais je n'ai pas compris cette syntaxe...

    Citation Envoyé par danielhagnoul Voir le message
    Pour le fun (puisque résolu) et au bénéfice des lecteurs de cette discussion, version tenant compte des accents.
    Merci, je vais regarder...

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

Discussions similaires

  1. Variable qui stock le nombre de cellule colorées d'une colonne
    Par captaincss dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 01/07/2014, 22h45
  2. [Débutant] compter le nombre de caractères dans une phrase saisie
    Par gnamienbenedicte dans le forum C#
    Réponses: 3
    Dernier message: 25/04/2014, 13h53
  3. programme qui calcule le nombre de caractères d'une chaîne
    Par sk8trasher dans le forum Débuter
    Réponses: 15
    Dernier message: 21/06/2012, 09h12
  4. [PHP 4] fonction qui augmente le nombre du caractéres
    Par king_soft dans le forum Langage
    Réponses: 3
    Dernier message: 28/03/2010, 00h52
  5. Compter le nombre de caractère d'une chaîne
    Par kespy13 dans le forum Langage
    Réponses: 3
    Dernier message: 19/04/2006, 18h04

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