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

Windows Forms Discussion :

List<> Séparation d'un string.


Sujet :

Windows Forms

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2010
    Messages : 12
    Points : 9
    Points
    9
    Par défaut List<> Séparation d'un string.
    Bonjours,
    J'ai un peu de difficultés au niveau d'une méthode..

    Je dois découper un string (fichier texte dans une string) en mot. Cependant, je ne dois pas avoir de duplicata, ni de ponctuation et ni d'espace. Un genre de dictionnaire quoi.

    Pour ce qui est des duplicatas, j'ai une superbe méthode qui fonctionne à merveille.

    Voici ma méthode pour le reste.

    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
     public void TransferMots(string texte)
            {
                int g = 1;
                int f = 0;
                char[] tabIndex = texte.ToCharArray();
                for (int i = 1; i < (tabIndex.Length-1); i++)//crée le tableau d'index pour la séparation des mots
                {
     
                    if (char.IsWhiteSpace(tabIndex[i])&( (char.IsLetter(tabIndex[i - 1]) & char.IsLetter(tabIndex[i + 1]))))
                    {
                        tabMot[f] = i;
                        f++;
                        tabMot[f] = i;
                        f++;
                    }
                    else if (char.IsWhiteSpace(tabIndex[i]) & (char.IsLetter(tabIndex[i - 1]) | char.IsLetter(tabIndex[i + 1])))//Reste a déterminer 
                    {
                        tabMot[f] = i;
                        f++;
                        tabMot[f] = i;
                        f++;
                    }
                }
                for (int i = 0; i < 379; i++)//transpher les mots du string normaliser dans la liste......revoir les indexs,le 200 est temporaire
                {
                    if (texte[i] == ' ')
                    {
                        dictio.Add(texte.Substring(tabMot[g], (tabMot[g + 1] - tabMot[g])));
                        g++;
                        g++;
                    }
                }
            }

    Elle contient beaucoup de faille. Je ne vois pas comment je pourrais l'optimisé et la faire fonctionner a 100%.
    Merci de votre aide!

  2. #2
    Membre expert
    Avatar de Pongten
    Homme Profil pro
    IT Analyst & Software Developer
    Inscrit en
    Juin 2002
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : IT Analyst & Software Developer
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 173
    Points : 3 543
    Points
    3 543
    Par défaut
    Si tu peux utiliser Linq, ceci peut peut-être faire l'affaire non ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    string _test = "il, fait. beau; ce soir !";
     
    List<String> _result = _test.Split(new char[] { '.', ';', ',', '!' }, StringSplitOptions.RemoveEmptyEntries).Distinct().ToList();
    Si ton problème a une solution, rien ne sert de t'inquiéter..
    Si il n'en a pas, t'inquiéter ne sert à rien


  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 99
    Points : 93
    Points
    93
    Par défaut
    Et une bonne regex avec un match sur \w+ ?

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2010
    Messages : 12
    Points : 9
    Points
    9
    Par défaut
    Cependant, j'ai une contrainte... Je ne dois pas utiliser le .Split, je dois créer mes propres méthodes en fait.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 99
    Points : 93
    Points
    93
    Par défaut
    Ah c'est un exercice pour l'école ou qqch comme ça.

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2010
    Messages : 12
    Points : 9
    Points
    9
    Par défaut
    Ouais. Projet de fin de session et je suis bloqué la. Je me suis dit que j'aurais peut-être de l'aide en postant ici.

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par NokyDaOne Voir le message
    Et une bonne regex avec un match sur \w+ ?
    +1, avec une regex de ce type ça prend une ligne, et y a pas besoin de se préoccuper des différents caractères de ponctuation

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    string[] mots =
        Regex.Matches(texte, @"\w+")
                .Select(m => m.Value)
                .Distinct()
                .ToArray();
    Par contre si tu peux pas utiliser Split, je suppose que tu ne peux pas non plus utilise les regex

    EDIT:
    Nom : Guillaume Lévesque
    Eh, on est cousins (éloignés sans doute, vu l'orthographe différente...)

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 99
    Points : 93
    Points
    93
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Par contre si tu peux pas utiliser Split, je suppose que tu ne peux pas non plus utilise les regex
    Ça paraitrait cohérent. :p

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2010
    Messages : 12
    Points : 9
    Points
    9
    Par défaut
    Tenez, voila mes consignes xD Ça va aider beaucoup plus je crois.

    Exigences
    Vous devez faire l’analyse du texte qui consiste à extraire les mots qu’il contient, de les
    afficher une liste de mots relevés (sans doublon), et finalement d’indiquer les
    statistiques c.-à-d. le nombre de caractères lus, le nombre de mots valides analysés, le
    nombre de mots présents dans la liste des mots relevés.
    Un mot rencontre les règles suivantes :
    1. a. est constitué de lettres seulement
    2. b. ne tient pas compte de la casse du mot
    3. c. un mot qui contient des chiffres doit être rejeté
    4. Ex. james01tiberus02kirk doit être rejeté en entier.
    5. d. en présence d’une élision (apostrophe), chaque mot est valide et distinct, et

    l’apostrophe doit faire partie du mot qui la précède.
    Ex. d’une comprend 2 mots : d’ et une

    Contraintes
    Vous n’être pas autorisé à utiliser la fonction String.Split() dans ce travail pratique.
    Vous devez développer votre propre logique d’extraction.
    Pour ceux qui auraient les connaissances ou accès à des expressions déjà bâties, l’emploi
    des expressions régulières n’est pas autorisées dans ce travail pratique.

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 99
    Points : 93
    Points
    93
    Par défaut
    Ouais un grand classique.

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2010
    Messages : 12
    Points : 9
    Points
    9
    Par défaut
    J'suis tout perdu moi.

    Malgré tout, j'ai réussis à me faire une petite méthode avec un static et un foreach pour remplacer le .Distinct mais la je sais pas quoi faire, avec ce que j'ai comme code présentement, mon programme est beaucoup trop lourd quand je veux analyser un texte de 500 pages... (Un livre sert d'évaluation en passant. Le programme du prof prend exactement 0,22 secondes pour 549 pages.)

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 99
    Points : 93
    Points
    93
    Par défaut
    Je vois plusieurs point :

    * tu travailles avec une string, ne peux-tu travailler avec un stream plutot ?
    * tu passes ton temps à vérifier le caractère d'avant, d’après etc... essaye de ne lire chaque caractère qu'une seule fois, et de coder les choses avec genre un système d'état (je suis dans un mot, je suis en dehors d'un mot, je suis entre deux mots (cas spécial de l'apostrophe))

    Je sais pas si cela te fera réellement gagner du temps, mais c'est les premières choses que j'essayerai si j'avais à coder ton truc.

  13. #13
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2010
    Messages : 12
    Points : 9
    Points
    9
    Par défaut
    Je travaille avec un stream, qui est converti en string ensuite.

    Je vérifie le caractère d'avant et d'après car je dois vérifier s'il y a 2 espaces ou non, etc. Ma méthode a beaucoup de défauts...

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 99
    Points : 93
    Points
    93
    Par défaut
    Justement, tu ne devrais pas avoir ce besoin là.

  15. #15
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2010
    Messages : 12
    Points : 9
    Points
    9
    Par défaut
    Ça revient comme au début ^^'' C'est la que je suis bloqué, je ne vois pas comment je pourrais faire ça...

  16. #16
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Moi je ferais quelque chose comme ça:

    - tu avances dans la chaine, caractère par caractère
    - tu maintiens un StringBuilder qui correspond au mot courant
    - quand tu arrives sur un caractère qui ne fait pas partie d'un mot, si le StringBuilder n'est pas vide, tu ajoutes son contenu à la liste des mots (sauf si la liste contient déjà le mot), et tu crées un nouveau StringBuilder

    Quelque chose dans ce gout là :

    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
    HashSet<string> words = new HashSet<string>(); // HashSet pour éviter d'avoir à gérer les doublons manuellement
    StringBuilder currentWord = new StringBuilder();
    foreach(char c in text)
    {
        if (Char.IsLetter(c))
        {
            // Début ou suite d'un mot
            currentWord.Append(c);
        }
        else if (currentWord.Length > 0)
        {
            // Fin d'un mot
            words.Add(currentWord.ToString());
            currentWord = new StringBuilder();
        }
    }
     
    // Ajout du dernier mot
    if (currentWord.Length > 0)
    {
        words.Add(currentWord.ToString());
    }
    J'ai pas testé donc il peut y avoir des bugs, mais ça doit être à peu près ça... Il faudra modifier un peu pour gérer les statistiques, et le cas particulier de l'apostrophe.

    D'autre part, pour ignorer la casse, il faudrait passer un comparateur spécifique au constructeur du HashSet (StringComparer.CurrentCultureIgnoreCase devrait faire l'affaire)

  17. #17
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2010
    Messages : 12
    Points : 9
    Points
    9
    Par défaut
    Je vais aller tester ça!

    Je viens du Québec donc, ouais, j'ai un autre patois xD

Discussions similaires

  1. [Debutant] liste d'objets et non de strings
    Par Slumpy dans le forum R
    Réponses: 2
    Dernier message: 19/02/2014, 15h49
  2. construire une liste a partir d'une variable string
    Par Palsajicoco dans le forum Débuter avec Java
    Réponses: 5
    Dernier message: 12/07/2011, 10h05
  3. [Débutant] Liste avec des valeurs associées aux string
    Par Bouillou dans le forum C++Builder
    Réponses: 3
    Dernier message: 16/03/2006, 18h11
  4. Conversion List -> String
    Par Bayard dans le forum Général Python
    Réponses: 1
    Dernier message: 27/11/2005, 21h50
  5. Comparaison d'une liste de string à un string
    Par maxazac dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 19/10/2005, 15h39

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