2010-07-08 56 views
2

确定我做错了什么,但无法实现什么:) 我填充一个键/值对集合Map keyValuePairs与数据,当我尝试检查集合以通用方式keyValuePairs.containsKey(“Name”)获取特定键存在并取回“false”。但keyValuePairs.keySet()会返回“名称”存在的密钥集。匹配后HashMap.containsKey(Object key)找不到密钥

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  
    } 
} 
} 

输出结果:

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

“keyValuePairs”= HashMap中(ID = 830062742672) {LocationId = 1,默认值=真,可编辑=真,名称=胡麻afskrivning,ID = 1,转录= FALSE}

“keyValuePairs.keySet()”= HashMap的$ 1(ID = 830062763448)
[LocationId,默认,可编辑的,姓名,ID,转录]

“keyValuePairs.containsKey(” 姓名 “)”=假

有谁请给我解释一下什么是错呢?谢谢。

+2

您确定您的密钥是“名称”,而不是“名称”或“名称”或甚至是“\ tName”吗? – Riduidel 2010-07-08 13:32:33

+1

可能希望包含正在使用的正则表达式和源数据,这将有助于回答@Riduidel的问题 – andersoj 2010-07-08 13:39:03

+1

我们可以在匹配程序正则表达式中获得高峰吗?可能很容易,你错配了一些东西。无论如何,在执行.put(...)之前对String键进行规范化通常是一个好主意。 – 2010-07-08 13:42:13

回答

3

引用您的问题给的信息:

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

在一些关键的名称前面的额外空间提示插入钥匙是" Name"(注意前面的空格)。如果您提供有关正则表达式的更多信息,我们可能会弄清楚为什么会发生这种情况。

您也可以通过记录/打印什么group(1)group(2)匹配来自行调试;我相信你会发现它匹配多余的空格。

快速修复是将group(1).trim()group(2).trim()放入地图中,但更好的选择是修复正则表达式。

+1

我会猜测正则表达式就像'([^ =] *)=(...)'。解决方案可能只是在组1前面添加'\ s *'。 – polygenelubricants 2010-07-08 13:46:48

+0

我绝对正确,谢谢! – Maxim 2010-07-08 14:00:30

+0

@Maxim:如果你提供了足够的信息,我可能会说服你使用'Scanner'。或者也许还有其他一些专门的库来处理键/值对,java.util.Properties et.al. – polygenelubricants 2010-07-08 14:03:36