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 :

Retirer les doublons d'un HashMap en se basant sur la valeur


Sujet :

Collection et Stream Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de StripMat
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2014
    Messages
    206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Maine et Loire (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2014
    Messages : 206
    Par défaut Retirer les doublons d'un HashMap en se basant sur la valeur
    Bonjour à tous, je suis en train de m'arracher les cheveux !!

    J'ai besoins dans un développement de retirer les doublons d'un HashMap. Ce HashMap contient des noms de colonnes provenant de tableaux et récupérés en XML via un webservice. Seulement ces XML peuvent contenir plusieurs fois le même noms de colonne et j'ai donc besoins de retirer les doublons de ma liste.

    J'ai donc développé une fonction pour retirer ces doublons, algo a priori simple et sans difficultés particulière mais pour une raison qui m'échappe, celui-ci ne fonctionne pas toujours !

    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
     
    static HashMap<String, HashMap<String, String>> removeDoubleColonnes(HashMap<String, HashMap<String, String>> lesColonnes)
    	{
     
    			Boolean noDouble = false;
    			Boolean Ok = false;
    			HashMap<String, HashMap<String, String>> resultat = lesColonnes;
    			System.out.println("\navant:"+lesColonnes);
    		try{	
    			while(!noDouble)
    			{
    				Iterator it = ((HashMap<String, String>)resultat.entrySet().iterator().next().getValue()).entrySet().iterator();
    				ArrayList<String> nomsColonnes = new ArrayList<String>();
    				Ok = true;
    				while(it.hasNext())
    				{
    					Map.Entry col = (Map.Entry)it.next();
    					String nomCol = col.getValue().toString().trim();
    					nomCol = nomCol.trim();
    					String idCol = col.getKey().toString();
    					if(nomsColonnes.contains(nomCol.trim()))
    					{
    						//((HashMap<String, String>)lesColonnes.entrySet().iterator().next().getValue()).remove(idCol);
    						it.remove();
    						Ok = false;
    					}
    					else
    					{
    						String tmp = new String(col.getValue().toString().trim());
    						tmp = tmp.trim();
    						nomsColonnes.add(tmp);
    					}
     
    				}
    				if(Ok)
    					noDouble = true;
     
    			}
    		}catch(Exception z){System.out.println(z.getMessage());}
    		System.out.println("\naprès :"+resultat);
    		return resultat;
    	}

    Résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    avant: {1={11=Rôle contact, 12=Rôle contact, 1=Code contrat cadre, 2=Code contrat, 3=EDS, 4=Numéro d'appel, 5=Est résilié, 6=Nom Contact, 7=Nom Contact, 8=Prenom Contact, 9=Téléphone contact, 10=Email contact}, 2={22=Code postal, 23=Ville, 24=Pays, 25=Pays, 10=Email contact, 11=Téléphone contact, 12=Libellé rôle contact site factur, 13=Adresse contact site facturation, 14=Adresse contact site facturation, 15=Code postal site facturation, 16=Ville contact site facturation, 17=RS / Adresse 1, 18=RS / Adresse 1, 19=RS Adresse postale, 1=Code contrat cadre, 2=Code contrat, 3=Code site facturation, 4=Libellé site facturation, 5=Libellé site facturation, 6=Cycle facturation, 7=Nom contact site facturation, 8=Prénom contact site facturation, 9=Email contact, 20=Adresse 2, 21=Adresse 3}, 3={1=Code contrat cadre, 2=Code contrat, 3=Code contact, 4=Nom contact signataire contrat, 5=Nom contact signataire contrat, 6=Prénom contact signataire contrat, 7=Téléphone contact, 8=Email contact}}
     
    après :{1={11=Rôle contact, 1=Code contrat cadre, 2=Code contrat, 3=EDS, 4=Numéro d'appel, 5=Est résilié, 6=Nom Contact, 8=Prenom Contact, 9=Téléphone contact, 10=Email contact}, 2={22=Code postal, 23=Ville, 24=Pays, 25=Pays, 10=Email contact, 11=Téléphone contact, 12=Libellé rôle contact site factur, 13=Adresse contact site facturation, 14=Adresse contact site facturation, 15=Code postal site facturation, 16=Ville contact site facturation, 17=RS / Adresse 1, 18=RS / Adresse 1, 19=RS Adresse postale, 1=Code contrat cadre, 2=Code contrat, 3=Code site facturation, 4=Libellé site facturation, 5=Libellé site facturation, 6=Cycle facturation, 7=Nom contact site facturation, 8=Prénom contact site facturation, 9=Email contact, 20=Adresse 2, 21=Adresse 3}, 3={1=Code contrat cadre, 2=Code contrat, 3=Code contact, 4=Nom contact signataire contrat, 5=Nom contact signataire contrat, 6=Prénom contact signataire contrat, 7=Téléphone contact, 8=Email contact}}
    Dès fois sa fonctionne "Rôle contact" (11/12) par exemple, mais pas pour "Pays" (24/25)...

    Le principe est pourtant simple...
    - Parcours de lu HashMap, le nom de la colonne existe-il dans ma liste temporaire (nomsColonnes) ? Si OUI, je supprime l'objet courant du HashMap (Iterator.remove), si NON je l'ajoute a ma liste temporaire et passe au suivant.

    Si dans ma liste j'ai trois fois le même nom, la première fois je l'ajoute a ma liste temporaire et les deux autres fois je supprime les occurrences dans mon HashMap...

    Je suis encore débutant en Java, y a peut-être plus simple et plus efficace.

  2. #2
    Modérateur

    Avatar de Robin56
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juin 2009
    Messages
    5 297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juin 2009
    Messages : 5 297
    Par défaut
    Pourquoi ne pas utiliser un HashSet pour ce genre de besoin ? (http://fmora.developpez.com/tutoriel...troduction/#L- )
    C'est plus simple et efficace.
    Responsable Java de Developpez.com (Twitter et Facebook)
    Besoin d'un article/tutoriel/cours sur Java, consulter la page cours
    N'hésitez pas à consulter la FAQ Java et à poser vos questions sur les forums d'entraide Java
    --------
    Architecte Solution
    LinkedIn : https://www.linkedin.com/in/nicolascaudard/

  3. #3
    Membre confirmé Avatar de StripMat
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2014
    Messages
    206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Maine et Loire (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2014
    Messages : 206
    Par défaut
    Je ne connaissais pas cet objet, il parait tout indiqué. Je vais regarder la doc et mettre ça en place.

    C'est néanmoins curieux que ma fonction ne retire pas tous les doublons, comme si le .equals ne fonctionnait pas ?


    EDIT: Je vais sûrement m'en sortir avec un HashSet mais j'aurais préféré garder le principe de key/value du HashMap, ou le key représente un l'index de mes colonne.

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Ton problème c'est que tu essaie de traiter toutes tes HashMap en même temps. (tu as une hashmap de hashmap)
    ta boucle de sortie s'arrête dès qu'une des hashmap a été traitée. D'ailleurs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Iterator it = ((HashMap<String, String>)resultat.entrySet().iterator().next().getValue()).entrySet().iterator()
    Fait que tu ne pourra jamais traiter que la première hashmap interne.

    Bref tout l'algo est à revoir. A la rigueur, le equals est peut être la seule chose qui soit bonne dedans .

  5. #5
    Membre confirmé Avatar de StripMat
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2014
    Messages
    206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Maine et Loire (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2014
    Messages : 206
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Ton problème c'est que tu essaie de traiter toutes tes HashMap en même temps. (tu as une hashmap de hashmap)
    ta boucle de sortie s'arrête dès qu'une des hashmap a été traitée. D'ailleurs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Iterator it = ((HashMap<String, String>)resultat.entrySet().iterator().next().getValue()).entrySet().iterator()
    Fait que tu ne pourra jamais traiter que la première hashmap interne.

    Non non, ça c'est voulu.

    Le fait d'avoir un HashMap<String, HashMap<String, String>> c'est parceque je souhaite récupérer les colonnes (Index - Nom) d'un ONGLET ! J'ai donc besoins d'associer une KEY à mon HashMap contenant les colonnes.
    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <document>
    <onglet>
    <colonne>col1</colonne>
    <colonne>col2</colonne>
    <colonne>col3</colonne>
    </onglet>
    <onglet>
    <colonne>col1</colonne>
    <colonne>col2</colonne>
    <colonne>col3</colonne>
    </onglet>
    </document>

    J'aurais du préciser, mais le HashMap dont je souhaite retirer les doublons est le HashMap<String, String>

  6. #6
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Ca je l'ai compris. Ce que je te dit c'est que ne traite que la première de tes N hashmap<String,String>, pas les autre, et c'est exactement l'output que tu nous a donnée, la première est traitée, mais pas la deuxième.

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

Discussions similaires

  1. Supprimer les doublons de deux HashMaps
    Par wilddances dans le forum Collection et Stream
    Réponses: 1
    Dernier message: 27/03/2013, 13h31
  2. [MySQL] Retirer les doublons lors de l'affichage en php
    Par kakashi05 dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 12/08/2011, 17h21
  3. [AC-97] Requête qui retire les doublons en fonctions de 3 clefs primaires.
    Par Jazz_ dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 13/10/2010, 10h26
  4. Retirer les doublons de dates
    Par Mister Nono dans le forum Collection et Stream
    Réponses: 11
    Dernier message: 22/10/2007, 11h26
  5. Retirer les doublons du résultat
    Par Mister Nono dans le forum Requêtes
    Réponses: 1
    Dernier message: 08/10/2006, 12h47

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