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 :

[1.5] Tri d'une Map


Sujet :

Collection et Stream Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Par défaut [1.5] Tri d'une Map
    Bonsoir à toutes et à tous,

    dans le cadre d'un projet, je dois compter le nombre d'occurences de chaque caractères dans un texte, et pour ça, j'ai utilisé la méthode donnée par adi Guba qui fonctionne très bien.

    Seulement à la place d'Integer comme valeur j'ai une classe Symbole définie comme suis :
    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
    public class Symbole
    {
    	private Integer freq;
    	private double proba;
    	private double a;
    	private String code;
     
    	public Symbole()
    	{
    		freq= 1;
    		proba= 0.0;
    		a=  0.0;
    		code= "";
    	}
     
    	public int getFreq() { return freq; }
    	public double getProba() { return proba; }
    	public double getA() { return a; }
    	public String getCode() { return code; }
     
    	public void incrementFreq() { freq++; }
    	public void setProba(double p) { proba= p; }
    	public void setA(double aa) { a= aa; }
    	public void setCode(String c) { code= c; }
     
    	public String toString() { return new String("Fréquence : " + freq + " ; Probabilité : " + proba + " ; A : " + a + " Code : "  + code); }
    }
    Et j'aimerai pouvoir trier ma Map selon le critère proba. Possible ou dois-je changer d'implentation?

    C'est par l'adresse que vaut le bûcheron, bien plus que par la force. Homère

    Installation de Code::Blocks sous Debian à partir de Nightly Builds

  2. #2
    Membre émérite Avatar de remika
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    806
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 806
    Par défaut
    Si tu as une Map triée j'imagine que c'est une TreeMap.
    Tu peux par exemple utiliser une classe héritant de Comparator<Symbole> et l'utiliser dans le constructeur de ta TreeMap.

  3. #3
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Par défaut
    Pourrais-tu me donner un exemple de code pour voir de quoi il retourne et de comment l'implémenter?

    d'avance
    C'est par l'adresse que vaut le bûcheron, bien plus que par la force. Homère

    Installation de Code::Blocks sous Debian à partir de Nightly Builds

  4. #4
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Les maps sont des collections donc
    http://java.developpez.com/faq/java/...rierCollection

  5. #5
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Par défaut
    Merci sinok

    Voici donc ma nouvelle classe Symbole :
    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
    public class Symbole implements Comparable
    {
    	protected Integer freq;
    	protected double proba;
    	protected double a;
    	protected String code;
     
    	public Symbole()
    	{
    		freq= 1;
    		proba= 0.0;
    		a=  0.0;
    		code= "";
    	}
     
    	public int getFreq() { return freq; }
    	public double getProba() { return proba; }
    	public double getA() { return a; }
    	public String getCode() { return code; }
     
    	public void incrementFreq() { freq++; }
    	public void setProba(double p) { proba= p; }
    	public void setA(double aa) { a= aa; }
    	public void setCode(String c) { code= c; }
     
    	public String toString() { return new String("Fréquence : " + freq + " ; Probabilité : " + proba + " ; A : " + a + " ; Code : "  + code); }
     
    	public int compareTo(Object s)
    	{
    		int res= -1;
    		Symbole tmp;
    		if(s instanceof Symbole)
    		{
    			tmp= (Symbole) s;
    			if(this.getProba() > tmp.getProba())
    				res= 1;
    		}
    		return res; 
    	}
    }
    Seulement, la méthode sort utilisée pour trier les collections ne semble que trier les List et non les Map , autant dire que je suis perdu
    C'est par l'adresse que vaut le bûcheron, bien plus que par la force. Homère

    Installation de Code::Blocks sous Debian à partir de Nightly Builds

  6. #6
    Membre émérite Avatar de remika
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    806
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 806
    Par défaut
    Si tu fais simplement une TreeMap<Symbole>, comme tu as "implémenté Comparable", ta Map sera triée selon l'ordre que tu veux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Map<Symbole,Integer> map = new TreeMap<Symbole,Integer>();
    map.put(new Symbole(0.98),25);
    map.put(new Symbole(0.22),23);
    map.put(new Symbole(0.43),23);
    System.out.println(map);
    avec ta classe Symbole à peine modifiée :
    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     
    public class Symbole implements Comparable<Symbole> { 
        protected Integer freq;
        protected double proba;
        protected double a;
        protected String code;
     
        public Symbole()  {
            freq= 1;
            proba= 0.0;
            a= 0.0;
            code= "";
        }  
     
        public Symbole(double proba)  {
            freq= 1;
            this.proba = proba;
            a= 0.0;
            code= "";
        }  
     
        public int getFreq() {
            return freq;
        }
     
        public double getProba() {
            return proba;
        } 
     
        public double getA() {
            return a;
        } 
     
        public String getCode() {
            return code;
        }
     
        public void incrementFreq() {
            freq++;
        }  
     
        public void setProba(double p) {
            proba= p;
        }
     
        public void setA(double aa) {
            a= aa;
        }  
     
        public void setCode(String c) {
            code= c;
         }
     
        public String toString() {
            return new String("Fréquence : " + freq + " ; Probabilité : " + proba + " ; A : " + a + " ; Code : " + code);
        }
     
        public int compareTo(Symbole s)  {
            if(this.getProba() > s.getProba())  return 1;
            return -1;
        }
    }

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

Discussions similaires

  1. NullPointerException lors du tri d'une map
    Par snake264 dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 02/08/2012, 00h54
  2. Ne pas définir d'opérateur de tri dans une map
    Par Muetdhiver dans le forum SL & STL
    Réponses: 5
    Dernier message: 14/11/2007, 14h38
  3. Technique pour faire une map en relief
    Par rvzip64 dans le forum OpenGL
    Réponses: 4
    Dernier message: 28/06/2004, 22h44
  4. tri d'une liste
    Par Guigui_ dans le forum Langage
    Réponses: 4
    Dernier message: 09/01/2003, 18h08

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