Свойства сравнить вопрос - PullRequest
2 голосов
/ 21 июня 2010

Предположим, у вас есть 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 ", код выше думает, что это то же самое. Другими словами, это либо обрезка, либо игнорирование пробела.

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

Ответы [ 3 ]

7 голосов
/ 21 июня 2010

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

Сравнивает указанный объект с этой картой на равенство.Возвращает 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 голос
/ 21 июня 2010

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

Натуральная строка, содержащая только символы пробела, считается пустой и игнорируется. Строка комментария имеет ASCII '#' или '!' как его первый символ не пробела; строки комментариев также игнорируются и не кодируют информацию о ключевых элементах. В дополнение к разделителям строк, этот метод учитывает пространство символов ('', '\ u0020'), табуляцию ('\ t', '\ u0009') и подачу формы ('\ f', '\ u000C') для быть пустым пространством.

На этой странице более подробная информация .

Возможно, вам придется экранировать начальные и конечные пробелы в файле свойств, если они важны для вас.

0 голосов
/ 21 июня 2010

Поскольку метод 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);
}

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...