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 :

HashMap, insertion nouvelle clé, remplace une clé existante


Sujet :

Collection et Stream Java

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Décembre 2011
    Messages : 67
    Points : 44
    Points
    44
    Par défaut HashMap, insertion nouvelle clé, remplace une clé existante
    Bonjour,

    J'ai un problème avec un HashMap que j'utilise.
    J'explique brièvement le contexte :
    Je parcours un fichier texte qui contient plusieurs lignes, chaque ligne du fichier est séparé en deux par une regex, la première partie (le header), est insérée en clé, et le reste de la ligne est inséré en valeur du Map.
    Le problème est que la deuxième ligne (dont le header est différent de la première ligne) prend la place de la première alors que les valeurs sont différentes. La troisième ligne(il n' y a que 3 lignes dans le fichier que je teste) quant-à elle s'ajoute correctement. Je ne comprend pas pourquoi la deuxième ligne prend la place de la première.

    Le fichier texte que je lis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    "C","rh             ","PR2655    ","X966      ","25 Oct 2004","CAJ4519Z  ",230,50,25,35,0,0,5,+1.349314845255670E+04,-2.712601587502600E+01,+2.180848946738310E-02,-8.749904977140720E-06,+1.751666718999900E-09,-1.400290707153010E-13,0,0,0,0,0,0,0,0,0,0,+9.998473068012700E-01,+2.300000007351730E+02,-1.436213609428470E-09,+1.117750481277860E-12,-4.332080050870580E-16,+8.361880540944660E-20,-6.431260861353930E-24,0,0,0,0,0,0,0,0,0,0,+0.000000000000000E+00,-2.405720560349160E+04,+4.785658657128120E+01,-3.758508289953010E-02,+1.471039632999100E-05,-2.875184472672180E-09,+2.256773343172310E-13,0,0,0,0,0,0,0,0,0,0,+9.999820272170920E-01,-3.616941558087430E+04,+7.121773429436650E+01,-5.555739799625170E-02,+2.147389169781680E-05,-4.095832253442660E-09,+3.065850794478490E-13,0,0,0,0,0,0,0,0,0,0,+9.999869891535360E-01,+2.265158196029000E+04,-4.793450122745750E+01,+4.060432184423980E-02,-1.714168285222780E-05,+3.609575423795100E-09,-3.026835909605690E-13,0,0,0,0,0,0,0,0,0,0,+9.999915890181570E-01,-1.159370225459020E+04,+2.324582003407840E+01,-1.852171479528530E-02,+7.353329207024350E-06,-1.454427856073720E-09,+1.144959129518830E-13,0,0,0,0,0,0,0,0,0,0,+9.999722303655260E-01,-4.881659561795540E+04,+9.820984944683960E+01,-7.875898510409510E-02,+3.149515184154870E-05,-6.280345833056300E-09,+4.994289495665480E-13,0,0,0,0,0,0,0,0,0,0,+9.998055982536970E-01,-6.822779194425980E+02,+1.359989277322210E+00,-1.076972757680860E-03,+4.251787039510540E-07,-8.374140097683170E-11,+6.594881864605560E-15,0,0,0,0,0,0,0,0,0,0,+9.999275909842580E-01,-1.316413051204350E+06,+2.646814738235750E+03,-2.107717176216150E+00,+8.349841612352830E-04,-1.643937459203110E-07,+1.282735546493060E-11,0,0,0,0,0,0,0,0,0,0,+9.999914285560770E-01,+0.000000000000000E+00,+1.000000000000000E+00,+0.000000000000000E+00,+0.000000000000000E+00,+0.000000000000000E+00,+0.000000000000000E+00,0,0,0,0,0,0,0,0,0,0,+1.000000000000000E+00,+0.000000000000000E+00,+0.000000000000000E+00,+0.000000000000000E+00,+0.000000000000000E+00,+0.000000000000000E+00,+0.000000000000000E+00,0,0,0,0,0,0,0,0,0,0,+0.000000000000000E+00,+0.000000000000000E+00,+0.000000000000000E+00,+0.000000000000000E+00,+0.000000000000000E+00,+0.000000000000000E+00,+0.000000000000000E+00,0,0,0,0,0,0,0,0,0,0,+0.000000000000000E+00,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
    "C","rh             ","PR2655    ","X966      ","25 Oct 2004","CAJ4519Z  ",253,50,120,35,0,0,5,+7.191222438008560E+03,-1.471820036264630E+01,+1.206403100149950E-02,-4.934407487715490E-06,+1.006771443273210E-09,-8.201885863835780E-14,0,0,0,0,0,0,0,0,0,0,+9.998958694217330E-01,+2.529999991332200E+02,+1.726782086707090E-09,-1.369285030697200E-12,+5.402726147250920E-16,-1.060800627164650E-19,+8.292708044041960E-24,0,0,0,0,0,0,0,0,0,0,+0.000000000000000E+00,+1.933520587239170E+03,-4.229190493563290E+00,+4.168084412137960E-03,-2.019024303819790E-06,+4.788599899589320E-10,-4.371188659859830E-14,0,0,0,0,0,0,0,0,0,0,+9.999949001672690E-01,-2.360719491058720E+04,+4.844474606229680E+01,-3.938772346059290E-02,+1.590313481479540E-05,-3.176430486551920E-09,+2.496589601726130E-13,0,0,0,0,0,0,0,0,0,0,+9.999911513669070E-01,-1.171878684514500E+04,+2.261082307152880E+01,-1.701519735985610E-02,+6.274119432435520E-06,-1.121415616124440E-09,+7.721251539696240E-14,0,0,0,0,0,0,0,0,0,0,+9.999729195720420E-01,-1.101737206005470E+04,+2.269192089166930E+01,-1.857205764464940E-02,+7.574116477242510E-06,-1.539382608428180E-09,+1.246205668977250E-13,0,0,0,0,0,0,0,0,0,0,+9.999341595919720E-01,-1.915587317783390E+04,+3.980461502008860E+01,-3.293275425650420E-02,+1.358672715191830E-05,-2.795519164600870E-09,+2.293793826696370E-13,0,0,0,0,0,0,0,0,0,0,+9.999388326274640E-01,-3.388009750907920E+02,+6.845405832262020E-01,-5.449747154089940E-04,+2.153860615908470E-07,-4.226485852577590E-11,+3.302866492388240E-15,0,0,0,0,0,0,0,0,0,0,+9.999907416241190E-01,-6.491645736644400E+05,+1.361488357834960E+03,-1.123790981297780E+00,+4.616864062460210E-04,-9.436503740381630E-08,+7.643048206887390E-12,0,0,0,0,0,0,0,0,0,0,+9.999926036137280E-01,+0.000000000000000E+00,+1.000000000000000E+00,+0.000000000000000E+00,+0.000000000000000E+00,+0.000000000000000E+00,+0.000000000000000E+00,0,0,0,0,0,0,0,0,0,0,+1.000000000000000E+00,+0.000000000000000E+00,+0.000000000000000E+00,+0.000000000000000E+00,+0.000000000000000E+00,+0.000000000000000E+00,+0.000000000000000E+00,0,0,0,0,0,0,0,0,0,0,+0.000000000000000E+00,+0.000000000000000E+00,+0.000000000000000E+00,+0.000000000000000E+00,+0.000000000000000E+00,+0.000000000000000E+00,+0.000000000000000E+00,0,0,0,0,0,0,0,0,0,0,+0.000000000000000E+00,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
    "C","rh             ","PR2655    ","X966      ","25 Oct 2004","CAJ4519Z  ",198,50,120,35,0,0,5,+5.973921180313570E+03,-1.233554504984340E+01,+1.020621155645270E-02,-4.212978573312900E-06,+8.672460774781730E-10,-7.126701119066820E-14,0,0,0,0,0,0,0,0,0,0,+9.998885953621860E-01,+1.979999996830220E+02,+6.370454158329780E-10,-5.096703907069510E-13,+2.029191542477880E-16,-4.020726909118240E-20,+3.172222857042650E-24,0,0,0,0,0,0,0,0,0,0,+0.000000000000000E+00,-2.032046742827670E+04,+4.288405721445690E+01,-3.573853182677260E-02,+1.484421347380370E-05,-3.075624715781730E-09,+2.550935110958830E-13,0,0,0,0,0,0,0,0,0,0,+9.999147297090120E-01,-3.579270466342700E+03,+7.126282331385670E+00,-5.497987373893370E-03,+2.071816358570770E-06,-3.727585642276440E-10,+2.442623082243750E-14,0,0,0,0,0,0,0,0,0,0,+9.999891461161700E-01,+2.132751246724120E+04,-4.417478187305210E+01,+3.658149817872510E-02,-1.507827309342770E-05,+3.097017600228910E-09,-2.531386148745800E-13,0,0,0,0,0,0,0,0,0,0,+9.999486780183770E-01,-9.626020271543130E+02,+2.046666698354260E+00,-1.682554379857230E-03,+6.869668297817040E-07,-1.394893985332380E-10,+1.118277383644710E-14,0,0,0,0,0,0,0,0,0,0,+9.999934412238110E-01,-1.946915955765920E+04,+4.036383436561290E+01,-3.329902002844330E-02,+1.368282023742350E-05,-2.800739757863160E-09,+2.283751240456410E-13,0,0,0,0,0,0,0,0,0,0,+9.996252456738040E-01,-5.265847609812070E+01,+1.242949267799280E-01,-1.119955993564470E-04,+5.019798692967710E-08,-1.121939906963540E-11,+1.008261524578600E-15,0,0,0,0,0,0,0,0,0,0,+9.998348206754190E-01,-1.562926199337200E+05,+3.333402855671780E+02,-2.740501755782740E-01,+1.116860806681670E-04,-2.254515343104570E-08,+1.784201941684750E-12,0,0,0,0,0,0,0,0,0,0,+9.999907698033550E-01,+0.000000000000000E+00,+1.000000000000000E+00,+0.000000000000000E+00,+0.000000000000000E+00,+0.000000000000000E+00,+0.000000000000000E+00,0,0,0,0,0,0,0,0,0,0,+1.000000000000000E+00,+0.000000000000000E+00,+0.000000000000000E+00,+0.000000000000000E+00,+0.000000000000000E+00,+0.000000000000000E+00,+0.000000000000000E+00,0,0,0,0,0,0,0,0,0,0,+0.000000000000000E+00,+0.000000000000000E+00,+0.000000000000000E+00,+0.000000000000000E+00,+0.000000000000000E+00,+0.000000000000000E+00,+0.000000000000000E+00,0,0,0,0,0,0,0,0,0,0,+0.000000000000000E+00,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
    Je coupe chaque ligne entre les informations, puis les valeurs positive ou négatives.

    La méthode que j'utilise pour parcourir mon fichier et compléter le Map :

    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 static Map<String, String> readPolynomialFile(InputStream polynomialFileIs) throws IOException{
    		Map<String, String> tests = new HashMap<>();
    		//Lecture du flux du fichier 
    		InputStreamReader isr = new InputStreamReader(polynomialFileIs);
    		BufferedReader br = new BufferedReader(isr);
    		String line = null;
     
    		//Regex permettant de séparer les fichiers polynômes en deux parties :
    		//-la partie contenant les informations de l'essai
    		//-la partie contenant tout les coefficients des polynômes. 
    		Pattern regex = Pattern.compile("([^\\+|-]*)([+|-].*)");
    		Matcher matcher;
    		String headers;
    		String coeffs;
    		while((line = br.readLine()) != null){ //parcours des ligne du fichier
    			matcher = regex.matcher(line);
    			while(matcher.find()){ //traitement matcher
    				headers = matcher.group(1);
    				headers = StringUtils.removeEnd(headers, ",");
    				coeffs = matcher.group(2);
     
    				tests.put(headers, coeffs);
    			}			
    		}
     
    		return tests;		
    	}
    Pour le coup je me demande si je suis parti dans la bonne direction en utilisant un HashMap avec String en clé.

    Si vous avez une idée je suis preneur

  2. #2
    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
    Salut,

    Tu es sûr ?

    Parce qu'avec ta regexp, ton fichier d'entrée, on obtient (j'ai écourté les valeurs pour la lisibilité) :

    --
    key: "C","rh ","PR2655 ","X966 ","25 Oct 2004","CAJ4519Z ",253,50,120,35,0,0,5
    value: +7.191222438008560E+[...]
    --

    key: "C","rh ","PR2655 ","X966 ","25 Oct 2004","CAJ4519Z ",230,50,25,35,0,0,5
    value: +1.349314845255670E+[...]
    --

    key: "C","rh ","PR2655 ","X966 ","25 Oct 2004","CAJ4519Z ",198,50,120,35,0,0,5
    value: +5.973921180313570E+[...]
    --
    Donc bien 3 clefs/headers différentes.

    A part ton expression régulière, qui me semble déjà étrange (pour l'antislash exclu, par exemple ?), et qui doit pouvoir être simplifiée (genre au moins en Pattern regex = Pattern.compile("(.*?),([+-].*)");, ce qui permet de supprimer le StringUtils.removeEnd() en plus), je ne vois pas de problème.

    [EDIT]Tiens, entre autres simplifications, la méthode avec split :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Pattern regex = Pattern.compile(",(?=[+-])");
     
    for(String line : Files.readAllLines( <path> ) { 
       String[] tokens = regex.split(line, 2); 
       String headers = tokens[0];
       String coeffs = tokens[1];
       map.put(headers, coeffs); 
    }
    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.

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Décembre 2011
    Messages : 67
    Points : 44
    Points
    44
    Par défaut
    Pour l'expression régulière, je me suis trompé pour l’échappement du antislash, il n'a pas lieu d'être.

    Concernant mon problème, c'est très bizzare. J'ai fait du pas à pas et normalement je devrais avoir 3 Entry dans la table du HashMap.

    Premier ajout :
    Nom : Sans titre.png
Affichages : 174
Taille : 4,3 Ko

    deuxième ajout :
    Nom : Sans titre2.png
Affichages : 167
Taille : 5,0 Ko
    L'enregistrment du premier ajout(15 dans la table) est remplacé par le deuxième

    troisième ajout :
    Nom : Sans titre3.png
Affichages : 161
Taille : 5,3 Ko
    Troisième enregistrement s'ajoute normalement.

    edit : merci pour les simplifications apportées à mon expression

  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
    Il ne faut pas que tu te fondes sur ce tableau (attribut table) pour connaître le contenu de la map : il s'agit d'une représentation interne de la table de hashage, qui n'est pas destinée à être "human friendly" et ne correspond pas en l'occurence à un tableau d'associations clef/valeur. Si tu veux en (sa)voir plus, ouvre les noeuds correspondant aux entrées dans ta vue de déboguage : tu y verras un sous-attribut appelé next, qui te donnera, pour l'une des deux associations, la troisième.
    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
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par Greed29 Voir le message
    J'ai fait du pas à pas et normalement je devrais avoir 3 Entry dans la table du HashMap.
    Il ne faut pas se fier à la vue de debug, à moins de connaitre avec précision le fonctionnement interne de HashMap.
    Les entrées y sont organisé afin d'optimiser l'accès, et le résultat n'est pas forcément un tableau...



    a++

  6. #6
    Membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Décembre 2011
    Messages : 67
    Points : 44
    Points
    44
    Par défaut
    Ok merci à vous deux, j'ai en effet été trompé par la vue du debug et tout mes enregistrements sont bien présents. Je ferais plus attentions à l'avenir.

    Merci encore !

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

Discussions similaires

  1. Remplacer une couleur existante
    Par hichamdeb dans le forum Balisage (X)HTML et validation W3C
    Réponses: 10
    Dernier message: 29/09/2011, 12h27
  2. Réponses: 4
    Dernier message: 24/04/2008, 15h46
  3. insertion de caractères dans une chaine existante.
    Par rassoncaro dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 25/03/2008, 14h25
  4. Remplacer une valeur existante dans une table
    Par bernardmichel dans le forum Requêtes et SQL.
    Réponses: 8
    Dernier message: 28/09/2007, 09h07
  5. Réponses: 5
    Dernier message: 15/12/2006, 17h34

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