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

C# Discussion :

Trier un tableau bidimensionnel par ordre alphabétique


Sujet :

C#

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 7
    Points : 4
    Points
    4
    Par défaut Trier un tableau bidimensionnel par ordre alphabétique
    Bonjour à tous,
    Mon problème est assez simple, j'ai un tableau de 4 colonnes contenant des strings et j'aimerais le classer par ordre alphabétique selon l'une des colonnes :

    Par exemple, j'aimerais à partir de ce tableau :

    Donnée1 | Donnée2 | Donnée3 | Donnée4
    1111111 | 1111111 | 1111111 | aaa
    3333333 | 3333333 | 3333333 | ccc
    2222222 | 2222222 | 2222222 | bbb

    obtenir :

    Donnée1 | Donnée2 | Donnée3 | Donnée4
    1111111 | 1111111 | 1111111 | aaa
    2222222 | 2222222 | 2222222 | bbb
    3333333 | 3333333 | 3333333 | ccc

    Mais en me servant que des données contenue dans la colonne "Donnée4".
    En effectuant des recherches sur msdn j'ai trouvé la méthode suivante qui a l'air de convenir étant donnée que c'est l'une des seules où il n'est pas indiqué que le tableau doit être unidimensionnel:

    Array.Sort, méthode générique (T[], Int32, Int32)

    Malheureusement l'exemple donnée traite d'un tableau unidimensionnel et je n'arrive pas à indiquer à la méthode qu'il ne faut effectuer le trie que sur la 4è colonne, et à chaque essaie j'obtiens
    "L'index se trouve en dehors des limites du tableau".
    j'ai effectué quelque recherche sur différent forum mais je n'ai trouvé aucune solution à mon problème (étant débutant, il est vrai que souvent je ne comprend pas les solutions avancés).

    Enfin bref voilà pourquoi je me tourne vers vous, en espérant que vous pourrez m'aider.
    Merci d'avance

  2. #2
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    On crée une SortedList<string,int> et, pour chaque ligne, on ajoute à cette liste un élément comportant comme clé la valeur de la colonne 4 et comme valeur l'indice de la ligne.

    Ensuite:
    • on crée un tableau intermédiaire de même type que le tableau initial,
    • on boucle sur la SotedList en copiant dans le tableau intermédiaire la ligne dont l'indice correspond à la Value de l'élément de la sortedList,
    • on copie le contenu du tableau intermédiaire dans le tableau initial.


    Remarque : pour ce type de traitement, l'utilisation d'objets "Lignes" pour les tableaux éviterait les opérations de copie de lignes (Les Values de la SortedList seraient alors des objet Lignes)

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Merci beaucoup pour votre réponse,

    Je viens d'essayer mais il semblerait que le fait que la valeur contenu dans la colonne 4 puisse revenir plusieurs fois pose problème, en effet j'ai reçu le message suivant
    Une entrée avec la même clé existe déjà.
    Je me suis peut être aussi trompé dans mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public string[,] Triage(string[,] tableau_initial)
            {
                string[,] tableau_trier = new string[tableau_initial.GetLength(1), 3];
                SortedList<string, int> SL1 = new SortedList<string,int>();
     
                for (int i = 0; i < tableau_initial.GetLength(1); i++)
                {
                    SL1.Add(tableau_initial[i, 3], i);//c'est ici que le debuggeur s'arrête.
     
                }
    //j'ai pas encore écrit la suite étant donné que ça coince avant
    return tableau_trier;
    Désolé, de ne pas avoir mentionné dans mon premier post que les données de la colonne pouvait revenir plusieurs fois. (du moins si c'est vraiment ça qui pose problème)

    En tout cas merci pour votre réponse.

  4. #4
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Bonjour,

    C'est vrai si il ya plusieurs valeurs identiques, on contournera le problème ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SL1.Add(tableau_initial[i, 3]+Char.MinValue+i.ToString(),i)

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Merci beaucoup, ça fonctionne à merveille

    Je met le code dès fois que ça puisse intéresser quelqu'un :
    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
    public string[,] Triage(string[,] tableau_initial)
            {
                string[,] tableau_trié = new string[nbligne, 4];
                SortedList<string, int> SL1 = new SortedList<string,int>();
     
                for (int i = 0; i < nbligne; i++)
                {
                    SL1.Add(tableau_initial[i, 3] + Char.MinValue + i.ToString(), i);
     
                }
     
               int j = 0;  
               foreach( KeyValuePair<string, int> kvp in SL1 )
                {
                    tableau_trié[j, 0] = tableau_initial[kvp.Value, 0];
                    tableau_trié[j, 1] = tableau_initial[kvp.Value, 1];
                    tableau_trié[j, 2] = tableau_initial[kvp.Value, 2];
                    tableau_trié[j, 3] = tableau_initial[kvp.Value, 3];
                    j++;
                }
     
     
                return tableau_trié;
            }

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

Discussions similaires

  1. trier un tableau d'objets par ordre alphabétique
    Par lhapaipai dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 02/09/2010, 17h25
  2. Réponses: 11
    Dernier message: 28/06/2010, 11h16
  3. [Tableaux] Trier un tableau par clé par ordre alphabétique
    Par pmithrandir dans le forum Langage
    Réponses: 3
    Dernier message: 20/08/2008, 14h00
  4. Trier par ordre alphabétique un tableau
    Par barbiche dans le forum Collection et Stream
    Réponses: 7
    Dernier message: 09/03/2007, 17h15
  5. [] Tri d'un tableau par ordre alphabétique
    Par cafeine dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 17/09/2002, 08h43

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