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 :
Dès fois sa fonctionne "Rôle contact" (11/12) par exemple, mais pas pour "Pays" (24/25)...
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}}
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.
Partager