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

Langage Java Discussion :

Précision sur la méthode compare de l'interface Comparator


Sujet :

Langage Java

  1. #1
    Membre chevronné
    Avatar de Rony Rauzduel
    Homme Profil pro
    En formation Architecte logiciel
    Inscrit en
    Décembre 2008
    Messages
    638
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : En formation Architecte logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 638
    Par défaut Précision sur la méthode compare de l'interface Comparator
    Bonjour,

    Je voudrai utiliser la méthode compare de l'interface comparator de java.util afin d'effectuer un tri sur les valeurs en fonction des clés d'une SortedMap (car le tri s'effectue sur l'ordre naturel des clés).
    J'ai le code suivant :
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    private static void compareMapValues(Map<Integer,String> map) {
            synchronized (map) {
                Collections.synchronizedSortedMap(
                        new TreeMap<>(new Comparator() {
                            @Override
                            public int compare(Object o1, Object o2) {
                                return 0;
                            }
                        })
                );
            }
        }
    Par contre lorsque je change les attributs de la méthode compare(Integer o1, Integer o2) l'IDE me dit que je dois implémenter la méthode compare initiale.
    Dois-je redéfinir cette méthode pour effectuer ma comparaison?

    Merci par avance.
    Transact.

  2. #2
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    Il faut surtout paramétrer la classe anonyme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    	private static void compareMapValues(Map<Integer,String> map) {
            synchronized (map) {
                Collections.synchronizedSortedMap(
                        new TreeMap<>(new Comparator<Integer>() {
                            @Override
                            public int compare(Integer o1, Integer o2) {
                                return 0;
                            }
                        })
                );
            }
        }

    a++

  3. #3
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 579
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 579
    Par défaut
    Hello,

    Comparator est une classe générique. Il faut faire new Comparator<Integer>() et non pas juste new Comparator()

    Par contre, je ne vois pas bien quel ordre tu veux utiliser sur des Integer si ce n'est pas l'ordre naturel. Et en Java 1.8, il est plus pratique d'utiliser des lambdas plutôt que créer explicitement une implémentation anonyme de Comparator :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Map<Integer, String> map = new TreeSet<>((i1, i2) -> i1 - i2);
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre chevronné
    Avatar de Rony Rauzduel
    Homme Profil pro
    En formation Architecte logiciel
    Inscrit en
    Décembre 2008
    Messages
    638
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : En formation Architecte logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 638
    Par défaut
    En effet ce serait davantage la signature suivante :
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Collections.synchronizedSortedMap(
                            new TreeMap<>(new Comparator<String>() {
                                @Override
                                public int compare(String o1, String o2) {
                                    return o1.compareTo(o2);
                                }
                            })
                    );

  5. #5
    Membre chevronné
    Avatar de Rony Rauzduel
    Homme Profil pro
    En formation Architecte logiciel
    Inscrit en
    Décembre 2008
    Messages
    638
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : En formation Architecte logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 638
    Par défaut
    Par contre le tri ordonnée ne se fait pas.

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 579
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 579
    Par défaut
    Avec ton code, tu crées une superbe SortedMap<String, NIMPORTEQUOI> vide, qui triera ses futures clés avec le comparator donné, et dont les accès multithreadés seront synchronisés.

    ... Et après avoir créé cette SortedMap vide, tu n'en fais rien et tu la laisses reprendre par le garbage collector.
    C'était quoi l'idée ? À quoi sert le paramètre map ? Et le fait de se synchroniser dessus ? Comment sais-tu que le tri ne se fait pas, puisqu'elle ne contient jamais d'élément et qu'il n'y a jamais rien à trier ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre chevronné
    Avatar de Rony Rauzduel
    Homme Profil pro
    En formation Architecte logiciel
    Inscrit en
    Décembre 2008
    Messages
    638
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : En formation Architecte logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 638
    Par défaut
    L'idée est de passer une map en paramètre de ma méthode et que mon comparateur effectue un tri ordonné des valeurs de cette map.
    Je décide de synchroniser cette map afin d'eviter les accès concurentiels ... pour la suite de mon exercice.

  8. #8
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 579
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 579
    Par défaut
    Mbon, et une fois qu'on a trié ces données, est-ce qu'il y a volonté de faire quelque chose avec ? Parce que la méthode renvoie void, là. Je suppose qu'on ne trie pas pour la beauté du geste.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  9. #9
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par transact Voir le message
    L'idée est de passer une map en paramètre de ma méthode et que mon comparateur effectue un tri ordonné des valeurs de cette map.
    Ce n'est pas du tout ce que fait ton code... puisque tu crées une nouvelle map que tu n'utilises pas.

    Et on ne peut pas trier les clefs d'un Map.
    Les clefs des maps ne sont pas forcément trié. Cela dépend de l'implémentation de la Map.

    Bref c'est quelque chose à définir lors de la création de la Map, pas après...


    a++

  10. #10
    Membre chevronné
    Avatar de Rony Rauzduel
    Homme Profil pro
    En formation Architecte logiciel
    Inscrit en
    Décembre 2008
    Messages
    638
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : En formation Architecte logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 638
    Par défaut
    Entendu, je vais revoir la conception de mon code pour l'imlémentation de la Map.
    je me suis penché sur l'utilisation de l'interface Comparator de l'API Java, je vous transmets l'intégralité de mon code. Cependant le tri ne s'effectue toujours pas sur les valeurs.

    Code java : 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
     
    public class Main {
        public final static int NB_FRUITS = 10;
     
        /**
         * Note : This method allows you to sort a Map by values against by keys
         * We have to used a compare method of Comparator interface to realize it.
         *
         * @param map the map that we want to sort by values
         * @param <K> the type of keys maintained by this map
         * @param <V> the type of mapped values
         * @return A Map sort by values, so a SortedMap but sort by values
         */
        public static <K, V extends Comparable<V>> Map<K, V> sortByValues(final Map<K,V> map) {
            Comparator<K> valueComparator = new Comparator<K>() {
                @Override
                public int compare(K o1, K o2) {
                    int compare = map.get(o1).compareTo(map.get(o2));
                    if(compare == 0)
                        return 1;
                    else
                        return compare;
                }
            };
            Map<K, V> sortedByValues = new TreeMap<K, V>(valueComparator);
            sortedByValues.putAll(map);
            return sortedByValues;
        }
     
        public static void buildMap(Map<Integer,String> map) {
            String fruit;
            for (int i = 0; i < NB_FRUITS; i++) {
                fruit = TextIO.getlnString(); // replace Scanner class
                map.put(i,fruit);
            }
        }
     
        public static void displayMap(Map<Integer,String> map) {
            for (Map.Entry<Integer,String> fruit :  map.entrySet()) {
                System.out.println(fruit.getKey() + " : " + fruit.getValue());
            }
        }
     
        public static void main(String[] args) {
            TreeMap<Integer, String> tMap = new TreeMap<>();
            System.out.println("Please enter a fruit name in your basket : ");
            buildMap(tMap);
            sortByValues(tMap);
            displayMap(tMap);
        }
    }

  11. #11
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    En même temps tu ne récupères pas le retour de la méthode sortByValue(), donc l'appel ne sert à rien !
    Tu crées des objets mais tu ne les utilises pas...

    Encore une fois le Comparator doit être spécifié à la création de la Map, pas après...


    De plus tu ne peux pas trier les éléments par valeurs, mais uniquement par clef.
    Ton code risque de poser divers problèmes dans de nombreux cas...


    a++

  12. #12
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    On se moque du tri d'un map, tant qu'on s'en sert pour récupérer des valeurs par leur clef. Avoir des données triées ne sert que lorsqu'on les parcourt : pourquoi ne pas trier l'entryset dans ce cas, au moment du parcours ?
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  13. #13
    Membre chevronné
    Avatar de Rony Rauzduel
    Homme Profil pro
    En formation Architecte logiciel
    Inscrit en
    Décembre 2008
    Messages
    638
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : En formation Architecte logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 638
    Par défaut
    Merci pour la pertinence de vos retours. Je reconnais qu'il est tout à fait "illogique" du point de vue fonctionnel de trier une Map par valeur.
    D'où la réponse d'Adiguba
    De plus tu ne peux pas trier les éléments par valeurs, mais uniquement par clef.
    Je parviens à récupérer le tri par valeur, en récupérant le retour de la méthode sortedByValues() et en l'affichant avec la méthode display

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     public static void main(String[] args) {
            TreeMap<Integer, String> tMap = new TreeMap<>();
            System.out.println("Please enter a fruit name in your basket : ");
            buildMap(tMap);
            Map<Integer, String> m = sortByValues(tMap);
            displayMap(m);
        }

    Merci encore et bonne journée.
    Transact.

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

Discussions similaires

  1. Précisions sur la class Process et la méthode waitFor()
    Par Pierre.B dans le forum Général Java
    Réponses: 13
    Dernier message: 28/08/2009, 16h51
  2. Réponses: 1
    Dernier message: 10/01/2009, 17h34
  3. précision sur la valeur de retour de la méthode GetDirectories
    Par piotrr dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 21/06/2007, 14h07
  4. Précision sur Oracle 9iAS r2
    Par Patmane dans le forum Oracle
    Réponses: 9
    Dernier message: 18/03/2007, 04h41
  5. Réponses: 8
    Dernier message: 01/03/2006, 18h41

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