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 :

[.NET 2.0] Trier un tableau associatif par valeur [Débutant]


Sujet :

VB.NET

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 126
    Points : 55
    Points
    55
    Par défaut [.NET 2.0] Trier un tableau associatif par valeur
    Bonjour

    Je travaille sur un projet en VB.NET (sous .NET Framework 2.0), et j'ai un tableau associant une clé de type Integer, et une valeur de type Double :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Key     Value
    1       4.666666666666667
    2       7.333333333333333
    3       5.333333333333333
    4       3.3333333333333335
    5       2.0
    6       4.333333333333333
    7       5.333333333333333
    8       5.333333333333333
    9       4.0
    10      3.3333333333333335
    11      6.0
    12      4.0
    13      5.0
    Je dois trier le tableau par valeur en ordre décroissant, tout en gardant l'association clé => valeur, donc au final je devrais avoir quelque chose comme ç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
    Key     Value
    2       7.333333333333333
    11      6.0
    3       5.333333333333333
    7       5.333333333333333
    8       5.333333333333333
    13      5.0
    1       4.666666666666667
    6       4.333333333333333
    9       4.0
    12      4.0
    4       3.3333333333333335
    10      3.3333333333333335
    5       2.0
    Je stocke les données dans une List de KeyValuePair (j'hésite entre ça ou un Dictionary) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim maListe As New List(Of KeyValuePair(Of Integer, Double))
    Ensuite il faut que j'appelle la méthode Sort en définissant mon propre Comparer, j'ai essayé ce code trouvé sur stackoverflow :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    myList.Sort( (x,y) => x.Value.CompareTo(y.Value) )
    Mais ça ne fonctionne pas, et a vrai dire ça ne m'étonne pas vraiment, ça ressemble à la nouvelle syntaxe, je ne sais pas si elle est compatible avec .NET 2.0.

    Bref, je débute et c'est la galère, merci de votre aide.

  2. #2
    Modérateur

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2007
    Messages
    1 996
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 996
    Points : 3 102
    Points
    3 102
    Par défaut
    Le Dictionnary est en effet tout indiqué pour ce que tu veux faire.
    Pour le tri, il va falloir procéder à l'ancienne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Dim maListe As New Dictionary(Of Integer, Double)()
     
    Public Function SortDictionaryByValue() As Dictionary(Of Integer, Double)
    	Dim tmpList As New List(Of KeyValuePair(Of Integer, Double))(maListe)
     
    	tmpList.Sort(Function(firstPair As KeyValuePair(Of Integer, Double), secondPair As KeyValuePair(Of Integer, Double)) firstPair.Value.CompareTo(secondPair.Value))
     
    	Dim sortedDictionary As New Dictionary(Of Integer, Double)()
    	For Each pair As KeyValuePair(Of Integer, Double) In tmpList
    		sortedDictionary.Add(pair.Key, pair.Value)
    	Next
     
    	Return sortedDictionary
    End Function
    C'est un peu verbeux. En C#, l'utilisation d'un délégué aurait pas mal facilité la chose.

  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 : 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 Galdon Voir le message
    Mais ça ne fonctionne pas, et a vrai dire ça ne m'étonne pas vraiment, ça ressemble à la nouvelle syntaxe, je ne sais pas si elle est compatible avec .NET 2.0.
    Bah c'est surtout que c'est du C#, pas du VB.NET (et de toutes façons cette syntaxe requiert C# 3 ou plus)... en .NET 2 / VB 8, il n'existe pas de syntaxe pour faire une méthode anonyme. Il faut que tu déclares une méthode distincte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    myList.Sort(AddressOf CompareByValue)
     
    ...
     
    Function CompareByValue(KeyValuePair(Of Integer, Double) x, KeyValuePair(Of Integer, Double) y) As Integer
        x.Value.CompareTo(y.Value)
    End Function

  4. #4
    Modérateur

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2007
    Messages
    1 996
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 996
    Points : 3 102
    Points
    3 102
    Par défaut
    OK. Il y avait plus simple que ma proposition à base de Dictionary

  5. #5
    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 calagan99 Voir le message
    OK. Il y avait plus simple que ma proposition à base de Dictionary
    Nos réponses se sont croisées, j'avais pas vu la tienne... Ce n'est pas une bonne idée de faire comme ça, car l'ordre des éléments dans un dictionary est indéterminé. Le fait qu'en pratique les éléments semblent rester dans l'ordre où on les a insérés est simplement dû à une particularité de l'implémentation de Dictionary<TKey, TValue>, et ce n'est absolument pas garanti par la doc, bien au contraire :

    L'ordre dans lequel les éléments sont retournés est non défini.
    En pratique, tant que tu ne fais qu'ajouter des éléments, ils resteront dans l'ordre, mais si tu commences à en supprimer et à en ajouter d'autres, ça ne marche plus...

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 126
    Points : 55
    Points
    55
    Par défaut
    Merci pour vos réponses, entre temps j'avais essayé la méthode que propose tomlev mais ça n'avait pas fonctionné (erreur de compilation) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Shared Function MyComparer(ByVal x As KeyValuePair(Of Integer, Double), ByVal y As KeyValuePair(Of Integer, Double)) As Integer
    	Return x.Value.CompareTo(y.Value)
    End Function
     
    MaListe.Sort(MyComparer)
    Peut-être simplement à cause du AddressOf manquant...

    Donc finalement j'ai fait un vieux tri à bulle à l'ancienne, ça craint d'utiliser un framework et de devoir faire ça mais bon (si c'était en .NET 3.5+ j'aurais utilisé Linq mais là en 2.0 y'a pas).

  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 Galdon Voir le message
    Peut-être simplement à cause du AddressOf manquant...
    Effectivement j'avais oublié ça...

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 126
    Points : 55
    Points
    55
    Par défaut
    Citation Envoyé par Galdon Voir le message
    Merci pour vos réponses, entre temps j'avais essayé la méthode que propose tomlev mais ça n'avait pas fonctionné (erreur de compilation) ...
    Citation Envoyé par tomlev Voir le message
    Effectivement j'avais oublié ça...
    Non mais en fait je ne voulais pas dire que j'avais testé ton code et que ça marchait pas (je n'ai lu vos réponses qu'aujourd'hui), j'avais juste essayé de faire fonctionner Sort() avec mon propre IComparer, en improvisant et en lisant la doc.

    Donc là grâce à ton post j'ai compris pourquoi ça ne fonctionnait pas au moins

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

Discussions similaires

  1. [JavaScript] Trier un tableau associatif
    Par bigboomshakala dans le forum Contribuez
    Réponses: 19
    Dernier message: 13/04/2013, 00h26
  2. Réponses: 4
    Dernier message: 30/05/2010, 22h31
  3. [Tableaux] Trier un tableau associatif
    Par nass007 dans le forum Langage
    Réponses: 12
    Dernier message: 30/07/2008, 17h43
  4. Réponses: 5
    Dernier message: 02/04/2007, 17h49
  5. [Tableaux] trier un tableau associatif
    Par cijez dans le forum Langage
    Réponses: 3
    Dernier message: 11/07/2006, 16h07

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