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

Collection et Stream Java Discussion :

trier une liste de plusieurs facons


Sujet :

Collection et Stream Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Janvier 2006
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 45
    Par défaut trier une liste de plusieurs facons
    Bonjour,

    je souhaite trier une liste d'objets de la forme ArrayList<Boite>.
    La class Boite est comme suit(par commodité les arguments sont publics):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class Boite{
            public int profondeur;
    	public int largeur;
    	public int hauteur;
     
           public Boite(int profondeur, int largeur, int hauteur){
    		this.profondeur = profondeur;
    		this.largeur = largeur;
    		this.hauteur = hauteur;
    	        }
            }
    En fait, j'aimerais récupérer 3 nouvelles listes, chacune triée selon la largeur de la boite, hauteur puis profondeur.

    Le probleme c'est que j'ai fait 1 seul tri (selon la largeur), en utilisant l'interface Comparator et en implementant la methode compare(Boite b1, Boite b2), comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	public int compare(Boite b1, Boite b2){
    		return b1.largeur - b2.largeur;
     
    	}
    Et ensuite je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Comparator<Boite> z = new Boite(0,0,0);	
    Collections.sort(listeBoites, z);
    Mais est-il possible d'implementer compare(Boite b1,Boite p2) pour pouvoir comparer ensuite suivant la hauteur, et la profondeur sans avoir à creer 3 class pour implementer Comparator de 3 façons differentes?

    Toute aide serait la bienvenue
    Merci d'avance.

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 47
    Par défaut
    je me suis deja trouve confronte a ce probleme..
    j'ai une solution, mais je ne promet pas qu'elle soit la plus propre, mais elle fonctionne parfaitement.

    le but est de creer une variable de classe qui contient un entier (ce qui peut aussi etre fait avec des enum) qui definit le type de tri, exemple :


    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 Boite{
            private static int TYPE_TRI = 0;
            public static final int TRI_LARGEUR = 0, TRI_LONGUEUR = 1, TRI_HAUTEUR = 2;
            public int profondeur;
    	public int largeur;
    	public int hauteur;
     
           public Boite(int profondeur, int largeur, int hauteur){
    		this.profondeur = profondeur;
    		this.largeur = largeur;
    		this.hauteur = hauteur;
            }
     
            public int compare(Boite b1, Boite b2){
                    switch(TYPE_TRI) {
                            case TRI_LARGEUR:
                    		return b1.largeur - b2.largeur;
    			case TRI_LONGUEUR:
                    		return b1.longueur - b2.longueur;
    			case TRI_HAUTEUR:
                    		return b1.hauteur - b2.hauteur;
    			default:
                    		return b1.largeur - b2.largeur;
                    }
     
    	}
     
            public static void setTypeTri(int type) {
    		TYPE_TRI = type;
    	}
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public static void main(String args[]) {
    	ArrayList<Boite> boites = new ArrayList<Boite>();
    	boites.add.....
    	.....
    	Boite.setTypeTri(Boite.TRI_HAUTEUR);
    	Collections.sort(boites);
    }

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    156
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 156
    Par défaut
    T'as une coquille dans ton code ? non
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Comparator<Boite> z = new Boite(0,0,0);
    au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Comparator<Boite> z = new BoiteCompartor();
    En ajoutant un attribut discriminant tu aurais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Comparator<Boite> zLargeur = new BoiteComparator(BoiteComparator.LARGEUR);
    Comparator<Boite> zProfondeur = new BoiteComparator(BoiteComparator.PROFONDEUR);
    List<Boite> trieParLargeur = Collections.sort(listeBoites, zLargeur);
    List<Boite> trieProfondeur = Collections.sort(listeBoites, zProfondeur);
    Mais la solution la plus propre demeure l'usage de classes differentes.
    Voir le design Pattern "Stratégie"

    Edit : On a été plus rapide que moi :-)

Discussions similaires

  1. Réponses: 6
    Dernier message: 23/11/2012, 23h26
  2. [8.5] trier une liste en fonction de plusieurs dates
    Par Gotch59 dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 12/06/2007, 13h52
  3. [c#] Trier une liste de nombres liés.
    Par Joad dans le forum ASP.NET
    Réponses: 13
    Dernier message: 11/05/2005, 11h17
  4. [MFC] Classer une liste a plusieur colonne
    Par Kevgeii dans le forum MFC
    Réponses: 8
    Dernier message: 07/03/2005, 15h09
  5. [Debutant(e)]Trier une liste
    Par LeDébutantJava dans le forum Collection et Stream
    Réponses: 8
    Dernier message: 19/08/2004, 12h44

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