2010-07-08 5 views
2

Bien sûr, je fais quelque chose de mal, mais je ne peux pas réaliser ce que :) Je remplis une paire de clé/valeur collection KeyValuePairs avec des données, après que j'essaie de vérifier la collection pour l'existence de la clé spécifique d'une manière commune keyValuePairs.containsKey ("Nom") et revenir "faux". Mais keyValuePairs.keySet() renvoie un ensemble de clés où "Name" existe.HashMap.containsKey (clé d'objet) ne peut pas trouver une clé

public static void parseBusinessObject(String input, Object output) { 

Class parsingObject = output.getClass(); 
Field[] fields = parsingObject.getDeclaredFields(); 

Pattern pattern = Pattern.compile("([^{=;]*)=([^;}]*);"); 
Matcher matcher = pattern.matcher(/*input*/"anyType{Id=1; Name=Til afskrivning; LocationId=1; Editable=true; Default=true; Transcribed=false; }"); 
Map<String, String> keyValuePairs = new HashMap<String, String>(); 
while (matcher.find()) { 
    if(!keyValuePairs.containsKey(matcher.group(1))){ 
    keyValuePairs.put(matcher.group(1).trim(), matcher.group(2).trim()); 
} 
} 

for (Field field : fields) { 
    if(keyValuePairs.containsKey(field.getName())){ 
     //TODO: add values to fields  
    } 
} 
} 

résultat de sortie après l'appariement:

Id=1; 
Name=Til afskrivning; 
LocationId=1; 
Editable=true; 
Default=true; 
Transcribed=false; 

"keyValuePairs" = HashMap (id = 830062742672) {LocationID = 1, valeur par défaut = true, modifiable = true, Name = Til afskrivning, Id = 1, Transcrit = false}

"keyValuePairs.keySet()" = HashMap 1 $ (id = 830062763448)
[LocationID, par défaut, éditable, Nom, Id, Transcrit]

"keyValuePairs.containsKey (" Name ")" = false

Quelqu'un pourrait s'il vous plaît me expliquer ce qui ne va pas avec elle? Je vous remercie.

+2

Etes-vous sûr que votre clé est "Nom", et non "Nom" ou "Nom" ou même "\ tNom"? – Riduidel

+1

Peut-être souhaitez-vous inclure la regex que vous utilisez et les données sources, ce qui vous aiderait à répondre à la question de @ Riduidel – andersoj

+1

Pouvons-nous obtenir un pic à votre matcher regex? Il se pourrait facilement que vous ne correspondiez pas à quelque chose. C'est généralement une bonne idée de normaliser les clés String avant de faire un .put (...) quand même. –

Répondre

3

Citant les informations que vous avez donné à la question:

"keyValuePairs.keySet()"= HashMap$1 (id=830062763448) 
[ LocationId, Default, Editable, Name, Id, Transcribed] 

Les espaces supplémentaires devant quelques-uns des noms clés suggèrent que la clé insérée était " Name" (notez l'espace précédent). Si vous donnez plus d'informations sur l'expression rationnelle, nous serons peut-être en mesure de comprendre pourquoi cela est arrivé.

Vous pouvez également déboguer vous-même en enregistrant/imprimant ce qui correspond à group(1) et group(2); Je suis sûr que vous trouverez que cela correspond aux espaces supplémentaires.

Une solution rapide est de mettre à la place group(1).trim() et group(2).trim() dans la carte, mais la meilleure option consiste à corriger l'expression régulière.

+1

Je vais deviner que la regex est quelque chose comme '([^ =] *) = (...)'. La solution consiste peut-être simplement à ajouter '\ s *' devant le groupe 1. – polygenelubricants

+0

Absolument correct, merci! – Maxim

+0

@Maxim: si vous donnez suffisamment d'informations, je serai peut-être en mesure de vous convaincre d'utiliser 'Scanner' à la place. Ou peut-être d'autres bibliothèques spécialisées pour gérer les paires clé/valeur, 'java.util.Properties' et.al. – polygenelubricants

Questions connexes