HashMap.containsKey (ключ объекта) не может найти ключ - PullRequest
2 голосов
/ 08 июля 2010

Конечно, я делаю что-то не так, но не могу понять, что :) Я заполняю коллекцию пары ключ / значение Map keyValuePairs данными, после того как я пытаюсь проверить коллекцию на предмет наличия конкретного ключа обычным способом keyValuePairs.containsKey ("Name") и возвращаю "false". Но keyValuePairs.keySet () возвращает набор ключей, в которых существует «Имя».

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, по умолчанию = true, редактируемый = true, имя = до открытия, Id = 1, транскрибировано = false}

"keyValuePairs.keySet ()" = HashMap $ 1 (id = 830062763448)
[LocationId, по умолчанию, редактируемый, имя, идентификатор, транскрибированный]

"keyValuePairs.containsKey (" Name ")" = false

Может кто-нибудь объяснить, что с ним не так? Спасибо.

1 Ответ

3 голосов
/ 08 июля 2010

Цитирую информацию, которую вы дали в вопросе:

"keyValuePairs.keySet()"= HashMap$1  (id=830062763448)  
[ LocationId,  Default,  Editable,  Name, Id,  Transcribed]

Лишние пробелы перед некоторыми именами клавиш предполагают, что вставленный ключ был " Name" (обратите внимание на предыдущий пробел). Если вы дадите больше информации о регулярном выражении, мы сможем выяснить, почему это произошло.

Вы также можете отладить это самостоятельно, зарегистрировав / распечатав, что соответствует group(1) и group(2); Я уверен, что вы обнаружите, что он соответствует лишним пробелам.

Быстрое решение - вместо этого поместить group(1).trim() и group(2).trim() на карту, но лучший вариант - исправить регулярное выражение.

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