2010-06-21 114 views
2

假設您有2個屬性對象。一個包含主屬性,另一個包含目標。你的工作是比較兩者。屬性比較問題

masterValue = masterProperties.getProperty(masterKey); 


for (Properties targetFileProperty : targetFileList) { 
    if (targetFileProperty.containsKey(masterKey)) { 
    targetValue = targetFileProperty.getProperty(masterKey); 

    if (masterValue.equals(targetValue)) { //<---- this is where the problem is 
     // do something clever 
    } else { 
     // do something clever 

我面臨在這個例子中的問題是這樣的:

當主密鑰是「A」和主值是「10」和目標鍵是「A」和「目標鍵爲」 10 「,上面的代碼認爲它們是相同的,換句話說就是修剪或忽略空白空間

你能否在我的邏輯中指出一個錯誤,或者提出一個更好的方法來斷定空格不是被忽略?謝謝

回答

5

java.util.Properties in herits其equals(Object)Hashtable,它實現Map equality

比較指定對象與此映射的相等性。如果給定的對象也是一個映射,並且這兩個映射表示相同的映射,則返回true。更正式地說,如果m1.entrySet().equals(m2.entrySet()),則兩張圖m1m2表示相同的映射。這確保了equals方法在Map接口的不同實現中正常工作。

所以,如果你想比較如果兩個Properties包含相同的鍵和值,你可以做props1.equals(props2)

至於你的問題,我不認爲你已經確定了真正的問題。 " 10 ".equals("10")絕對是false。問題可能是在輸入Properties的值之前修整了字符串(可以打印出您正在比較的值,看看是否確實如此)。

如果空格有意義,則必須在屬性文件中將其轉義。這裏有一個片段來展示它是如何做的:

Properties p = new Properties(); 
    p.put("X", " "); 
    p.store(System.out, "test"); 

此照片(我已經取代_爲清晰的空間):

#test 
#Mon Jun 21 22:20:04 ICT 2010 
X=\___ 
1

當讀取使用的getProperty()方法的空白屬性被忽略。這可以解釋:

只包含空格字符的自然行被認爲是空白的並被忽略。註釋行有一個ASCII'#'或'!'作爲它的第一個非空白字符;註釋行也被忽略,不對密鑰元素信息進行編碼。除了行結束符外,此方法還將字符空格('','\ u0020'),製表符('\ t','\ u0009')和換頁符('\ f','\ u000C')是空白的。

This page has more details

如果屬性文件對您很重要,您可能必須轉義屬性文件中的前導空格和尾部空格。

0

由於getProperty返回String的方法不應該有隱藏在

masterValue.equals(targetValue) 

什麼注意事項我認爲,正在發生的事情是,當它加入到Properties地圖屬性值進行修剪。

您是否通過調用targetFileProperty.getProperty("A")來檢查obect返回的值實際上是" 10 "而不是"10"?因爲如果它是"10"這意味着setProperty(String key, String value)具有削減的實現,但我只是檢查它和它的定義爲

public synchronized Object setProperty(String key, String value) { 
    return put(key, value); 
} 

所以這不應該是你的問題..

你確定你是字符串放在不同的屬性是不同的?這可能聽起來微不足道,但我沒有看到任何簡單的解釋..