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

VB.NET Discussion :

Trier par value au lieu de key dans une SortedList


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juillet 2003
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 37
    Par défaut Trier par value au lieu de key dans une SortedList
    Bonjour à tous!

    Je remarque que dans une SortedList le tri semble pouvoir se faire uniquement sur les keys et non sur les values.

    Mon cas précis, c'est que j'ai une séries d'applications (string) dont j'incrémente un compteur à chaque fois qu'elles sont utilisées, et je veux trier en ordre décroissant le compteur en question. Donc à la limite je pensais utiliser le compteur comme key et le nom de l'application comme value. Donc le tri se ferait sur le compteur et ma SortedList me retournerait toujours les applications les plus utilisées dans le bon ordre.

    Sauf que si une clé est dupliquée, une erreur surviendra si j'utilise la méthode "add", ou sinon en utilisant la propriété "item" la valeur existante sera écrasée. Et comme le compteur en question peut être identique pour plusieurs de mes applications, il s'avère que mon idée ne peut fonctionner.

    Je me demande donc, y a-t-il moyen de faire un tri via les values au lieu des keys, ou devrais-je me créer un autre pattern pour faire le tri en question?

    Merci d'avance de l'aide que vous pourrez m'apporter à ce sujet.

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 217
    Par défaut
    La classe SortedDictionary adresse exactement votre besoin reformulé.

  3. #3
    Membre averti
    Inscrit en
    Juillet 2003
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 37
    Par défaut
    Salut lysiandad,

    Merci de ta réponse, mais je regarde la msdn et le SortedDictionnary semble se comporter de façon identique à la SortedList :

    Représente une collection des paires clé/valeur qui sont triées sur la clé.

    Chaque clé contenue dans SortedDictionary doit être unique.

    La méthode Add lève ArgumentException lors de la tentative d'ajout d'une clé dupliquée.
    Et de même, la propriété Item remplacera la valeur existante.

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 217
    Par défaut
    Je parlais bien de votre propre seconde approche.

    Citation Envoyé par Griswold Voir le message
    [...]
    ou devrais-je me créer un autre pattern pour faire le tri en question?
    Voici le code d'exemple tiré de la doc .NET FX :

    (lire les commentaires : vous trierez sur la clé, unique oui, qui sera votre nom d'appli, et non sur la valeur, qui sera vos compteurs, avec cette classe)

    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
     
    // Create a new sorted dictionary of strings, with string
    // keys.
    SortedDictionary<string, string> openWith = 
        new SortedDictionary<string, string>();
     
    // Add some elements to the dictionary. There are no 
    // duplicate keys, but some of the values are duplicates.
    openWith.Add("txt", "notepad.exe");
    openWith.Add("bmp", "paint.exe");
    openWith.Add("dib", "paint.exe");
    openWith.Add("rtf", "wordpad.exe");
     
    // The Add method throws an exception if the new key is 
    // already in the dictionary.
    try
    {
        openWith.Add("txt", "winword.exe");
    }
    catch (ArgumentException)
    {
        Console.WriteLine("An element with Key = \"txt\" already exists.");
    }
    c-a-d :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    appRank.Add("Opera", 1);
    appRank.Add("Chrome", 3);
    appRank.Add("Firefox", 3);
    appRank.Add("Internet Explorer", 2);
    Puis avec une simple List (mais pas "sorted" ) et un bout de code pas bien compliqué (tri à bulle sur les valeurs du SortedDico), plus qu'à présenter :

    Firefox (ou Chrome, de même rang) -- 3
    Chrome (ou Firefox, de même rang) -- 3
    Internet Explorer -- 2
    Opera -- 1

    Enfn, chaque fois que vous mettrez le SortedDico a jour, il faudra soit repeupler de zéro la list ou bien inserer dans/mettre a jour la liste.

    Où ai-je manqué quelque chose ?

    [ EDIT ]
    En fait, un simple Dictionary suffit (meme pas SortedDictionary) mais j'ai pensé que vous ameriez conserver quelque part l'information du tri ascendant ou descendant sur les noms, avant d'obtenir celui sur le "rang" (compteurs) ; d'où mon choix du SortedDictionary... pardon peut etre pour la confusion/l'omission

    Citation Envoyé par Griswold Voir le message
    Salut lysiandad,

    Merci de ta réponse, mais je regarde la msdn et le SortedDictionnary semble se comporter de façon identique à la SortedList :



    Et de même, la propriété Item remplacera la valeur existante.

  5. #5
    Membre averti
    Inscrit en
    Juillet 2003
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 37
    Par défaut
    Encore une fois, merci beaucoup pour le feedback.

    Advenant (comme c'est le cas) l'impossibilité que la liste puisse trier les values, c'est un peu le genre de solution auquel j'avais pensé.

    J'ai "googlé" un peu sur le sujet et je ne semble pas être le seul à m'être buté à ce problème. Une solution viable que certains avaient envisagé était d'implémenter l'interface IComparable pour redéfinir la méthode CompareTo, afin de modifier la façon dont les keys sont triées.

    Je l'ai essayé de mon côté et ça l'a donné ce qui suit. C'est fonctionnel, donc si jamais ça peut servir à quelqu'un tant mieux.

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    Public Class ApplicationMeter
        Implements System.IComparable(Of ApplicationMeter)
     
        Private _meter As Integer
     
        Public Sub New()
            _meter = 0
        End Sub
     
        Public Sub New(ByVal meter As Integer)
            _meter = meter
        End Sub
     
        Public Property Meter() As Integer
            Get
                Return _meter
            End Get
            Set(ByVal value As Integer)
                _meter = value
            End Set
        End Property
     
        'Implémentation de CompareTo pour faire le tri sur le compteur
        Public Function CompareTo(ByVal other As ApplicationMeter) As Integer Implements System.IComparable(Of ApplicationMeter).CompareTo
     
            If other.Meter - Meter = 0 Then
                'Si les clés sont égales retournera ArgumentException, donc on laisse dans l'ordre présent
                Return -1
            Else
                Return other.Meter - Meter
            End If
     
        End Function
     
        Public Overrides Function ToString() As String
            Return Convert.ToString(Meter)
        End Function
     
    End Class
     
    Public Class MyComparer
        Implements System.Collections.IComparer
     
        Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer _
            Implements System.Collections.IComparer.Compare
     
            Return x.CompareTo(y)
        End Function
    End Class
    Remarquez dans le code ci-dessus le "return -1" en cas d'égalité. Ça me permet d'éviter une ArgumentException si jamais je croises deux clés identiques.

    Par la suite dans mon code j'aurai quelque chose qui ressemble à ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
            Dim MostUsedApplications As SortedList()
            Dim applications As String() = '...
     
            MostUsedApplications = New SortedList(New MyComparer)
     
            For Each application As String In applications
                '...
                appMeter = New ApplicationMeter
                appMeter.Meter = Integer.Parse(application.Substring(meterDebut, meterFin))
     
                MostUsedApplications.Add(appMeter, application,Substring(idDebut, idFin)
            Next
    Dans le cas présent, l'implémentation de CompareTo fait en sorte de me retourner un tri descendant.

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

Discussions similaires

  1. Test de Key dans une array of Char
    Par Jipété dans le forum Langage
    Réponses: 3
    Dernier message: 29/03/2008, 16h49
  2. ajouter primary key dans une table
    Par DJERDJAR YACINE dans le forum Langage SQL
    Réponses: 2
    Dernier message: 04/07/2007, 00h35
  3. la division par zero pour effectuer un pourcentage dans une requete
    Par VIRGINIE87 dans le forum Requêtes et SQL.
    Réponses: 12
    Dernier message: 24/05/2007, 22h44
  4. Réponses: 1
    Dernier message: 19/02/2007, 19h18
  5. Réponses: 2
    Dernier message: 15/09/2006, 12h07

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