2010-07-08 54 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