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 :

c# Trier ArrayList [Débutant]


Sujet :

C#

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Août 2013
    Messages : 6
    Points : 4
    Points
    4
    Par défaut c# Trier ArrayList
    Bonjour,

    j’essaye de trier un arraylist qui contient 2 types d'objets différents (villa, usine qui sont 2 classes dérivées de la classe mère abstraite Batiment qu'elle a comme attributs proprietaire, adresse et surface), le problème c'est quand j’essaye de trier juste les villa selon la surface ça ne fonctionne pas correctement et je ne sais pas ou est le problème.

    Voila l'extrait de code ou je fais le trie par surface :

    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
     
    class TrierSurface : IComparer
        {
     
            public int Compare(object a, object b)
            {
                int res = 0;
     
                    Batiment a1 = (Batiment)a;
                    Batiment a2 = (Batiment)b;
     
                    if (a1 is Villa && a2 is Villa)
                    {
                        if (a1.Surface > a2.Surface)
                        {
                            res = 1;
                        }
     
                        if (a1.Surface < a2.Surface)
                        {
                            res = -1;
                        }
                        if (a1.Surface == a2.Surface)
                        {
                            res = 0;
                        }
     
     
                    }
     
                    return res;
     
     
            }
    au moment d'appel :

    liste.Sort(new TrierSurface());

    le contenu d'arraylist avant trie :

    Dsty fr250 1600 AQW 160 140 26800 //Usine : proprietaire adresse surface...
    Sir df5 500 9 True 750 //Villa
    Zes w598 100 20 False 300 //Villa
    Saoma szs987 1500 GFR 300 120 36000 //Usine
    Ader az12 700 12 False 250 //Villa
    Klot drb02 250 8 True 800 //Villa

    arraylist après trie :

    Zes w598 100 20 False 300 //Villa
    Saoma szs987 1500 GFR 300 120 36000 //Usine
    Sir df5 500 9 True 750 //Villa
    Ader az12 700 12 False 250 //Villa
    Klot drb02 250 8 True 800 //Villa
    Dsty fr250 1600 AQW 160 140 26800 //Usine

  2. #2
    Membre éprouvé
    Avatar de neilbgr
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2004
    Messages
    651
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Août 2004
    Messages : 651
    Points : 1 177
    Points
    1 177
    Par défaut
    Je pense qu'il faut aussi traiter le cas où une villa et une usine sont à comparer.
    "Si vous voulez être l’esclave des banques et payer pour financer votre propre esclavage, alors laissez les banquiers créer la monnaie" - Josiah Stamp, 1920, Gouverneur de la Banque d’Angleterre
    "Qui ne peut acheter ruine qui voudrait vendre" - Jacques Duboin.
    "Nous n'héritons pas la terre de nos parents, nous l'empruntons à nos enfants." - Antoine de Saint Exupéry

  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
    Quel est le résultat que tu veux obtenir ? Tu dis que tu ne veux trier par surface que pour les villas, mais dans ce cas, que fais-tu des usines ?

  4. #4
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Août 2013
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    tomlev je veux obtenir un résultat à peu près comme celui-là :

    Dsty fr250 1600 AQW 160 140 26800 //Usine
    Zes w598 100 20 False 300 //Villa
    Klot drb02 250 8 True 800 //Villa
    Saoma szs987 1500 GFR 300 120 36000 //Usine
    Sir df5 500 9 True 750 //Villa
    Ader az12 700 12 False 250 //Villa

    je ne sais pas si c'est possible mais je veux que les usines restent à leurs places sinon le plus important est que les villas seront triées

  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
    C'est peut-être possible, mais c'est complexe, et je ne pense pas qu'on puisse le faire en implémentant juste un IComparer... Mais de toute façon je ne vois pas très bien l'intérêt de faire ça, ce n'est pas très pratique pour la lecture des résultats

  6. #6
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Août 2013
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    neilbgr ta réponse m'a donné une idée que j'ai testé et ça marche du premier coup, voilà ce que j'ai fait :
    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
     
    class TrierSurface : IComparer
        {
     
            public int Compare(object a, object b)
            {
                int res = 0;
     
                if (a is Usine || b is Usine) // je commence par tester si a ou b est une usine
                {
                    return res; // retourne 0
                }
     
                Batiment a1 = (Batiment)a;
                Batiment a2 = (Batiment)b;
     
                if (a1.Surface == a2.Surface)
                {
                    res = 0;
                }
     
                if (a1.Surface > a2.Surface)
                {
                    res = 1;
                }
     
                if (a1.Surface < a2.Surface)
                {
                    res = -1;
                }
     
     
     
                return res;
     
            }
    le contenu avant trie :

    Dsty fr250 1600 AQW 160 140 26800 //Usine : proprietaire adresse surface...
    Sir df5 500 9 True 750 //Villa
    Zes w598 100 20 False 300 //Villa
    Saoma szs987 1500 GFR 300 120 36000 //Usine
    Ader az12 700 12 False 250 //Villa
    Klot drb02 250 8 True 800 //Villa

    après trie :

    Zes w598 100 20 False 300 //Villa
    Klot drb02 250 8 True 800 //Villa
    Sir df5 500 9 True 750 //Villa
    Ader az12 700 12 False 250 //Villa
    Dsty fr250 1600 AQW 160 140 26800 //Usine
    Saoma szs987 1500 GFR 300 120 36000 //Usine

    merci pour vos réponses

  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
    A vrai dire je ne comprends pas très bien comment ça peut donner un résultat différent, parce qu'en supposant que tu n'aies que des villas et des usines dans la liste, ton nouveau code est exactement équivalent à l'ancien...

    En plus ça ne correspond pas à ce que tu disais : tu voulais que les usines restent à la même place, mais là ce n'est pas le cas.

  8. #8
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Août 2013
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    tomlev ta raison ça à marché juste car j'ai fait l'erreur suivant :

    if (a is Usine || a is Usine)
    {
    return res;
    }
    j'ai testé sur a mais je ne sais pas pourquoi ça marche avec ce test

  9. #9
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Août 2013
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    J'ai utilisé :

    liste.Sort(0, list.Count, new TrierSurface());

    et ça ma marche cette fois

    Ze w 598 100 20 False 300 //villa
    Dsty fr 25000 1600 AQW 160 140 26800 //usine
    Khalid derb 02 250 8 True 800 //villa
    Saoma szs 987 1500 GFR 300 120 36000 //usine
    Said df 5 500 9 True 750 //villa
    Ahmed az 12 700 12 False 250 //villa

    la méthode ignore les usines et trie les villas correctement

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

Discussions similaires

  1. Trier un arrayList selon differents criteres
    Par TangoZoulou dans le forum Collection et Stream
    Réponses: 9
    Dernier message: 07/05/2009, 11h05
  2. trier une collection ou une arraylist
    Par r83 dans le forum C#
    Réponses: 3
    Dernier message: 21/10/2008, 10h06
  3. trier une liste d'objets dans une ArrayList
    Par sandrine49 dans le forum Collection et Stream
    Réponses: 9
    Dernier message: 13/10/2008, 08h59
  4. trier une arraylist selon un critère
    Par marion5515 dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 15/03/2008, 20h25
  5. [ STRUTS ][ JSP ][ ArrayList] un lien pour trier
    Par LoulouFifi dans le forum Servlets/JSP
    Réponses: 7
    Dernier message: 03/02/2004, 17h24

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