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 :

[XNA]Trier les valeurs d'un dictionnaire


Sujet :

C#

  1. #1
    Membre éclairé Avatar de avogadro
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 412
    Par défaut [XNA]Trier les valeurs d'un dictionnaire
    Bonjour à tous,

    je souhaite donc trier les valeurs d'un dictionnaire, valeurs que je charge à l'aide d'un fichier xml

    j'ai créé une classe pour lire mon fichier xml et mettre les valeurs dans un dictionnaire :

    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
        class Highscores
        {
            string name;
            int score;
            XmlDocument xmlDoc = new XmlDocument();
            Dictionary<String, int> mHighscores;
     
            public Highscores(string allScores)
            {
                mHighscores = new Dictionary<string,int>();
                Stream stream = File.OpenRead(allScores);
                xmlDoc.Load(stream);
                XmlNodeList nodeList = xmlDoc.GetElementsByTagName("Player");            
                for (int i = 0; i < nodeList.Count; i++)
                {
                    XmlNodeList childNodes = nodeList[i].ChildNodes;
                    name = childNodes[0].InnerText;
                    score = System.Int16.Parse(childNodes[1].InnerText);
     
                    mHighscores.Add(name, score);                
                }
            }
     
            public Dictionary<String, int> RankScores            
            {
                get
                {
                    return this.mHighscores;
                }
            }
        }
    puis dans l'étape suivante je créé mon objet highscore, c'est ici qu'il faudrait trier les valeurs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
                    int incr = 0;
                    Highscores scores = new Highscores(cheminduXML);                
                    foreach (KeyValuePair<string, int> s in scores.RankScores)
                    {
                        mSpriteBatch.DrawString(spriteFont3, s.Key, new Vector2(mScore.Width / 2 - 120, mScore.Height / 2 - 90 + incr * 20), Color.White);
                        mSpriteBatch.DrawString(spriteFont3, s.Value.ToString(), new Vector2(mScore.Width / 2 + 100, mScore.Height / 2 - 90 + incr * 20), Color.White);
                        incr++;
                    }
    j'ai cru voir qu'il fallait implémenter une classe ISortable mais j'ai pas trouvé d'exemple concret pour donner quelque chose du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    scores.RankScores.values.sort();
    Avez-vous une piste?

    Merci XD

  2. #2
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Août 2005
    Messages
    1 240
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 1 240
    Par défaut
    il me semble que pour le sort tu peuxc passer par un delegate. c'est un truc deu genre: delegate(toto obj1, toto, obj2){} où il faut que tu compares obj1 et obj2

  3. #3
    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 : 44
    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
    Par défaut
    Utilise un SortedDictionary à la place d'un Dictionary

  4. #4
    Membre éclairé Avatar de avogadro
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 412
    Par défaut
    Citation Envoyé par rattlehead Voir le message
    il me semble que pour le sort tu peuxc passer par un delegate. c'est un truc deu genre: delegate(toto obj1, toto, obj2){} où il faut que tu compares obj1 et obj2
    j'avais vu ca mais j'accède pas au sort qu'il utilise

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Dictionary<string, string> s = new Dictionary<string, string>();
            s.Add("1", "a Item");
            s.Add("2", "c Item");
            s.Add("3", "b Item");
     
            List<KeyValuePair<string, string>> myList = new
    List<KeyValuePair<string, string>>(s);
            myList.Sort(
               delegate(KeyValuePair<string, string> firstPair,
    KeyValuePair<string, string> nextPair)
               {
                   return firstPair.Value.CompareTo(nextPair.Value);
               }
            );
    j'avais aussi lu des infos pour le sorteddictionnary ici :
    http://en.csharp-online.net/BCL_Gene...y_TKey,_TValue

    en remplacant simplement tous mes 'dictionnary' par des 'sorteddictionnary' ça ne marche pas, faut chercher plus loin, il me les sort pas key et pas par value :S

  5. #5
    Membre éclairé Avatar de avogadro
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 412
    Par défaut
    j'ai inversée key et value mais il me range les scores du plus petit au plus grand, c'est logique je pense. Y a-t-il moyen de faire une sorteddictionary décroissant?

  6. #6
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut
    Avec un dictionnaire on ne peut trier que par la clé (aussi bien SortedDictionary que SortedList).

    en remplaçant simplement tous mes 'dictionnary' par des 'sorteddictionnary' ça ne marche pas, faut chercher plus loin, il me les sort pas key et pas par value :S
    j'ai inversée key et value mais il me range les scores du plus petit au plus grand
    Pourrais-tu clarifier tes propos ? Tu dis avoir inversé key et value, faut-il alors comprendre "il me les sort par value et pas par key", ou bien c'est parce que tu as interverti la clé et la valeur dans ton dictionnaire ?

    J'ai un doute pour le 1er cas, puisque c'est ce que le code que tu montres est censé faire. On va donc supposer que tu as interverti clé et valeur.

    A ce moment un dictionnaire n'est peut être pas utile puisqu'il est probable tu n'as pas vraiment de clé, sinon l'inversion n'aurait pas été possible. Tu te sers juste du dictionnaire comme raccourci pour gérer un couple de valeurs. Une classe contenant les informations et implémentant IComparable suffirait et une fois le tout dans un liste générique, c'est gagné. La méthode Sort() fera le reste.

  7. #7
    Membre éclairé Avatar de avogadro
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 412
    Par défaut
    je voulais dire qu'a la place de mettre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dictionary<String, int> mHighscores;
    j'ai mis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dictionary<int, string> mHighscores;
    en inversant le score de mes joueurs et le nom de mes joueurs (c'est ce que contient le fichier xml). Ce qui donne une liste dans ce sens :
    TOM 10
    JO 30
    BOOM 60
    ALA 140
    JEAN 360
    a la place de :
    JEAN 360
    ALA 140
    BOOM 60
    JO 30
    TOM 10
    => la clé me permet de ranger les scores dans le bon ordre. Vu mon niveau de connaissances je bricole avec ce que je connais pour donner le résultat attendu ^^

  8. #8
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut
    Ca te conviendrait ça ?
    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
    public class Joueur : IComparable<Joueur>
    {
        private string _nom;
        private int _score;
     
        public string Nom
        {
            get { return _nom; }
        }
     
        public int Score
        {
            get { return _score; }
            set { _score = value; }
        }
     
        public Joueur(string nom, int score)
        {
            _nom = nom;
            _score = score;
        }
     
        public int CompareTo(Joueur other)
        {       
            // Comparaison pour tri décroissant
            return other._score.CompareTo(_score);
            // Comparaison pour tri croissant
            // return _score.CompareTo(other._score);
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    List<Joueur> joueurs = new List<Joueur>();
    joueurs.Add(new Joueur("ALA", 140));
    joueurs.Add(new Joueur("TOM", 10));
    joueurs.Add(new Joueur("BOOM", 60));
    joueurs.Add(new Joueur("JO", 30));            
    joueurs.Add(new Joueur("JEAN", 360));
    // On tri la liste en utilisant le comparateur par défaut de la classe Joueur
    joueurs.Sort();
    Parce que le dictionnaire ne semble pas vraiment utile dans ton cas. Le tri n'étant possible que sur la clé, si tu mets le score en clé tu pourras trier. Le gros problème c'est qu'un score n'est pas une clé, tout comme le nom d'un joueur, en général tout du moins.

  9. #9
    Membre très actif
    Profil pro
    Inscrit en
    Février 2009
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 163
    Par défaut
    Coucou,

    à force de chercher j'ai trouvé comment trier mon dictionnaire de manière simple et efficace.

    Il suffit de faire d'utiliser un Dictionary.OrderBy() et d'y faire un ToDictionary() en suite.

    Regarde sur cette page, il y a un exemple.

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

Discussions similaires

  1. trier les valeurs d'un vecteur suivant un critère
    Par Nathaniel_etudiant dans le forum Simulink
    Réponses: 2
    Dernier message: 06/10/2010, 08h45
  2. Trier les valeurs identiques
    Par Furious68 dans le forum Requêtes
    Réponses: 1
    Dernier message: 04/04/2009, 07h20
  3. [6.5][Webi]Trier les valeurs d'une invite
    Par alextoucour dans le forum Webi
    Réponses: 10
    Dernier message: 08/11/2008, 17h05
  4. [Tableaux] Trier les valeurs d'un tableau
    Par altecad dans le forum Langage
    Réponses: 7
    Dernier message: 24/05/2007, 15h14
  5. [VBA]Trier les valeur d une liste par ordre croissant
    Par PierrotKun dans le forum VBA Access
    Réponses: 1
    Dernier message: 30/03/2007, 09h37

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