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 :

Comparator et SET/HASHMAP


Sujet :

Collection et Stream Java

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 10
    Points : 6
    Points
    6
    Par défaut Comparator et SET/HASHMAP
    Bonjour,
    J'essaie de comprendre comment fonctionnent les collections. J'ai un exercice qui me pose problème. Je dois créer une classe OrdreAlphabetique implements Comparator afin de trier la liste des contacts.

    J'ai créé une classe contact. J'ai au début (code incomplet si besoin je peux rajouter la suite):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    private String nom; 
    private Set<String> numTel;
    Autre classe NumTel qui contient les n° de tél associés aux contacts (j'ai mis juste le début):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    private HashMap<String, Contact> rep;
              public noTel(){
    	  tels = new HashMap<String,Contact>(); 
    	}
    Dans ma nouvelle classe, je ne sais pas comment faire le lien avec contact ou NumTel à moins qu'aucun des deux ne soit nécessaire.
    Faut-il transformer le HashMap en treeMap pour utiliser SortedMap, ou au contraire créer un ArrayList pour sort? Je suis totalement confus.
    Je ne sais pas par où commencer. Si vous avez une piste de réflexion que je puisse avancer sur cet exercice, ce serait super.

    Cdlt,
    Nesciio

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Tu as juste besoin de deux structures différentes.

    - Une qui indexe par numéro de téléphone pour retrouver facilement un contact à partir de son numéro : le HashSet<String, Contact> donc

    - Une autre qui retient les contacts par ordre alphabétique : un TreeSet<Contact>, donc.

    Tu n'auras pas les deux en un, c'est donc à toi de créer et maintenir les deux.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Bonjour,
    Merci pour ta réponse. Si tu pouvais développer un peu plus car ce n'est pas clair.
    Il faut trier les noms des contacts par ordre alphabétique, à priori cela n'induit pas de donner les tél.
    J'ai essayé ce code, est-il correct?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    public class OrdreAlphaBethique implements Comparator<Contact>{
     
    	public void compare() {
    		Set<Contact> personnes = new TreeSet<Contact>(); 
    		SortedSet persOrdAlph = new TreeSet<Contact>(personnes); 
    		for (Iterator iterator=persOrdAlph.iterator(); iterator.hasNext();)
    			System.out.println(iterator.next());
     
    		}
     
    	}
    Cdlt,
    Nesciio

  4. #4
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par nesciio Voir le message
    Bonjour,
    Merci pour ta réponse. Si tu pouvais développer un peu plus car ce n'est pas clair.
    Il faut trier les noms des contacts par ordre alphabétique, à priori cela n'induit pas de donner les tél.
    J'ai essayé ce code, est-il correct?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    public class OrdreAlphaBethique implements Comparator<Contact>{
     
    	public void compare() {
    		...
     
    	}
    Cdlt,
    Nesciio
    Salut,

    tu dois bien voir que ta classe ne compile pas : ta classe, puisqu'elle implémente Comparator<Contact> doit avoir la méthode public int compare(Contact o1, Contact o2).

    Ensuite, comme sa signature l'indique, le but de cette méthode est d'indiquer comment 2 contacts doivent être triés l'un par rapport à l'autre.

    Le comparateur (une instance de la classe) ensuite s'utilise en le passant en argument du constructeur de TreeSet, ou TreeMap.
    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.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Ok. Mais je ne suis pas sûr de comprendre. Les Collections, un sujet assez difficile à appréhender. Le souci est que je dois comparer des String et ici la méthode compare retourne un int. Alors je ne vois pas comment ce tri alphabétique va s'opérer.

    Je propose un code sachant qu'il ne fonctionne pas mais ton retour m'aidera à progresser.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public class OrdreAlphaBethique implements Comparator<Contact> {
    		public int compare(Contact 01, Contact 02) {
    			Set<Contact> personnes = new TreeSet<Contact>(Contact 01, Contact 02); 
    			SortedSet persOrdAlph = new TreeSet<Contact>(personnes); 
    			return persOrdAlph; 
    		}
     
    }
    Cdlt,
    Nesciio

  6. #6
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Il n'y a aucune raison d'utiliser des Set à l'intérieur d'un Comparator, qui comme son nom l'indique, sert juste à comparer des éléments.
    Il te sert à indiquer comment ordonner deux données l'une par rapport à l'autre, et cela n'a rien à voir avec des Set. Donc des set n'ont rien à faire dedans.

    Aussi compliqués que puissent être les Collection et les Comparator, la JavaDoc de Comparator indique très clairement pourquoi le type retourné est int, et comment ça marche. Il suffit de la lire.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par nesciio Voir le message
    Ok. Mais je ne suis pas sûr de comprendre. Les Collections, un sujet assez difficile à appréhender. Le souci est que je dois comparer des String et ici la méthode compare retourne un int. Alors je ne vois pas comment ce tri alphabétique va s'opérer.

    Je propose un code sachant qu'il ne fonctionne pas mais ton retour m'aidera à progresser.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public class OrdreAlphaBethique implements Comparator<Contact> {
    		public int compare(Contact 01, Contact 02) {
    			Set<Contact> personnes = new TreeSet<Contact>(Contact 01, Contact 02); 
    			SortedSet persOrdAlph = new TreeSet<Contact>(personnes); 
    			return persOrdAlph; 
    		}
     
    }
    Cdlt,
    Nesciio
    Les collections et les tris sont 2 choses relativement distincts.

    Prend en compte la comparaison à part.

    Dans la méthode compare, tu dois comparer 2 contacts pour les ordonner : tout d'abord il faut déterminer comment ordonner 2 contacts.

    A priori, pour un ordre alphabétique, on va comparer le nom des contacts, et éventuellement leur prénom, donc effectivement des String, qui eux sont comparables par leur méthode compareTo.

    Oui, la méthode compare retourne un int, dont la valeur est expliquée par la javadoc de cette méthode :
    - négative si arg1<arg2
    - nulle si arg1==arg2
    - positive si arg1>arg2

    Attention, dans un Set, si 2 éléments sont égaux (donc compare retourne 0), le set n'en conservera qu'un seul des deux : il faut donc que compare ne retourne 0 que si les 2 contacts sont exactement les mêmes.

    Donc ta méthode ça va être un truc dans le genre :

    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
    public int compare(Contact c1, Contact c2) {
     
                    String nom1=c1.getNom();	
                    String nom2=c2.getNom();	
     
                    // j'ai pas traité les cas d'erreurs possible (genre nom1 et/ou nom2 null)
                   int compare=nom1.compareTo(nom2);
                   if ( compare==0 ) {
     
                      // les noms sont les mêmes, on va comparer d'autres informations des contacts, comme par exemple le prénom :
     
                    String prenom1=c1.getPrenom();	
                    String prenom2=c2.getPrenom();	
     
                        compare=prenom1.compareTo(prenom2);
                   if ( compare==0 ) {
     
                      // les prenoms sont les mêmes, on va comparer d'autres informations des contacts, comme par exemple leur age, etc...
     
     
                        // au final, on pourra distinguer 2 contacts que sur une information unique (comme par exemple leur id en DB (s'ils viennent d'une db)) sinon on rentoutnrtz -1 pour conserver l'ordre de 2 contacts qu'on ne sait pas distinguer)
     
    }
     
                   }
                   return compare; 
     
    		}
    Ensuite, le comparateur s'utilise par exemple :

    - en argument d'un TreeSet pour obtenir un Set dont les éléments sont toujours dans l'ordre imposé par ce comparateur
    - en argument de la méthode Collections.sort(list,comparator) qui permet de trier une liste
    - etc.
    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.

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Merci pour cette explication. Je vais me replonger dans la doc mais parfois même en lisant, je ne comprends pas tout. Certains points m'échappent, une logique plutôt. Il faut du temps.
    C'est vraiment sympa de prendre du temps pour dépanner les novices.
    Petits conseils qui me serviront pendant l'exam.
    Cdlt,
    Nesciio

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

Discussions similaires

  1. Comparer deux set <string>
    Par jamsgoodon dans le forum Langage
    Réponses: 0
    Dernier message: 07/02/2011, 11h20
  2. Réponses: 10
    Dernier message: 13/08/2009, 13h51
  3. Comparer 2 à 2 les éléments d'un set
    Par 5kippy dans le forum SL & STL
    Réponses: 4
    Dernier message: 10/10/2007, 21h19
  4. Comparer 2 HashMap d'objets.
    Par Empty_body dans le forum Collection et Stream
    Réponses: 10
    Dernier message: 26/01/2007, 17h30
  5. [Collections][HashMap]Comparer les objets de la hashmap
    Par rvfranck dans le forum Collection et Stream
    Réponses: 11
    Dernier message: 16/12/2005, 21h29

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