Обход HashMap из HashMaps - PullRequest
       35

Обход HashMap из HashMaps

2 голосов
/ 01 декабря 2010

В Java я пытаюсь получить HashMap<String, Object>, у которого есть объект, который: HashMap<String, Object>.

Я реализовал рекурсивную функцию, которая возвращает либо HashMap<String, Object>, найденное с данным ключом, либо null, если ключ не был найден.

Вот функция:

public static HashMap<String, Object> getHashMap(HashMap<String, 
                                      Object> map, String key)
{
    for (Map.Entry<String, Object> entry : map.entrySet()) {
     if (entry.getValue().getClass().getName() == "java.util.HashMap") {
         if (entry.getKey() == key) 
          return (HashMap<String, Object>) entry.getValue();
         return getHashMap((HashMap<String, Object>) entry.getValue(), key);
     }
    }
    return null;
}

Работает только для первого элемента.Как пройти хэш-карту HashMaps?Какой подход лучше?

Ответы [ 3 ]

1 голос
/ 01 декабря 2010

Вместо немедленного возврата значения здесь:

return getHashMap((HashMap<String, Object>) entry.getValue(), key);

Вы хотите сначала проверить, не является ли он null, и вернуть его только тогда. В противном случае вам просто нужно продолжить поиск:

HashMap<String, Object> result = getHashMap((HashMap<String, Object>) entry.getValue(), key);
if (result != null)
  return result;
1 голос
/ 01 декабря 2010

Для одного не используйте == для строк.Вместо этого используйте метод equals.

Для другого я предпочитаю делать instanceof, например if (myObject instanceof java.util.Map) { ... }, чтобы ваша карта не обязательно была HashMap, если позже вы решите ее изменить.

0 голосов
/ 01 декабря 2010

Другой подход. Попробуйте использовать HashMap<String, HashMap<String, Object>> main для своего «внешнего» HashMap, тогда вы будете искать key:

Object value = main.get(key);
if (value == null) {
    for (HashMap<String, Object> inner : main.values()) {
        value = inner.get(key);
        if (value != null) {
            break;
        }
    }
}
...