2010-06-21 3 views
2

Предположим, у вас есть 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 

Проблема я столкнулся в этом примере заключается в следующем:

Когда главный ключ «А» и мастер-значение «10» и целевой ключ «А» и «целевой ключ» 10 », код выше считает, что это то же самое. Другими словами, это либо обрезка, либо игнорирование пробелов.

Можете ли вы указать на ошибку в моей логике или предложить лучший способ утверждать, что пробел не является

ответ

5

java.util.Properties в herits его equals(Object) от Hashtable, который реализует Map equality:

Сравнивает указанный объект с этой картой для равенства. Возвращает true, если данный объект также является картой, а две карты представляют одни и те же сопоставления. Более формально две карты m1 и m2 представляют собой те же сопоставления, если m1.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

При чтении свойства, используя GetProperty() метод пробельной игнорируются , Это может объяснить:

Естественная строка, содержащая только пробелы, считается пустой и игнорируется. Строка комментария имеет ASCII '#' или '!' как его первый небелый пробел; строки комментариев также игнорируются и не кодируют информацию о ключевом элементе. В дополнение к терминаторам строк этот метод рассматривает пространство символов ('', '\ u0020'), tab ('\ t', '\ u0009') и форму feed ('\ 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); 
} 

так, что не должно быть вашей проблемой ..

вы уверены, что строки вы разные свойства разные? Это может показаться тривиальным, но я не вижу легкого объяснения.

Смежные вопросы