属性比较问题

时间:2010-06-21 15:00:26

标签: java properties

假设您有2个Properties对象。一个包含主属性,另一个包含目标。你的工作是比较两者。

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“时,上面的代码认为这些是相同的。换句话说,它是修剪或无视白色空间。

你能指出我的逻辑中的错误还是建议一种更好的方法来断言空白是不容忽视的?谢谢。

3 个答案:

答案 0 :(得分:6)

java.util.Propertiesequals(Object)继承HashtableMap equality实现{{3}}:

  

将指定对象与此映射进行相等性比较。如果给定对象也是地图并且两个地图表示相同的映射,则返回true。更正式地说,如果m1,则两个地图m2m1.entrySet().equals(m2.entrySet())代表相同的映射。这可确保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 :(得分:1)

使用getProperty()方法读取属性时,将忽略空格。这可以解释:

  

仅包含空格字符的自然行被视为空白,将被忽略。注释行具有ASCII“#”或“!”作为它的第一个非白色空间角色;注释行也被忽略,不对关键元素信息进行编码。除了行终止符之外,此方法还考虑字符空格('','\ u0020'),制表符('\ t','\ u0009')和换页符('\ f','\ u000C')到是白色的空间。

This page has more details

如果它们对您很重要,您可能必须转义属性文件中的前导和尾随空格。

答案 2 :(得分:0)

由于方法getProperty返回String,因此

中不应隐藏任何警告
masterValue.equals(targetValue)

我认为发生的事情是,当属性值添加到Properties地图时,会对其进行裁剪。

您是否通过致电targetFileProperty.getProperty("A")来检查该对象返回的值是否有效" 10 "而非"10"?因为如果它是"10",这意味着setProperty(String key, String value)有一个修剪过的实现,但我只是检查了它,它被定义为

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

所以这不应该是你的问题..

你确定你在不同属性中放置的字符串有所不同吗?这可能听起来微不足道,但我没有看到任何简单的解释..