2010-12-01 44 views
2

En Java, j'essaie de récupérer un HashMap<String, Object> qui a l'objet qui est: HashMap<String, Object>.HashMap de HashMaps traversal

J'ai implémenté une fonction récursive qui renvoie le HashMap<String, Object> trouvé avec la clé donnée, ou null si la clé n'a pas été trouvée.

Voici la fonction:

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; 
} 

Il ne fonctionne que pour le premier élément. Comment je traverse une Hashmap de HashMaps? Quelle est la meilleure approche?

+2

Si vous voulez vérifier si un objet est un objet 'HashMap', utilisez' instanceof HashMap' ... comparer la classe un nom comme celui-là est une très mauvaise idée, d'autant plus que vous vous trompez (besoin d'utiliser 'equals'). Même alors, vous ne devriez pas vous soucier si quelque chose est un 'HashMap' spécifiquement ... il devrait suffire qu'il implémente' Map'. – ColinD

+0

Merci pour les conseils. Je l'ai modifié! –

Répondre

1

au lieu de retourner la valeur immédiatement ici:

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

vous voulez d'abord vérifier si ce ne null, et le retourner alors seulement. Sinon, vous devez continuer à chercher:

HashMap<String, Object> result = getHashMap((HashMap<String, Object>) entry.getValue(), key); 
if (result != null) 
    return result; 
+0

Merci beaucoup. Je n'avais pas vu ce point. Ça fonctionne parfaitement maintenant! –

1

Pour un, n'utilisez pas == pour les chaînes. Au lieu de cela, utilisez la méthode equals. Pour une autre, je préfère faire instanceof comme if (myObject instanceof java.util.Map) { ... } de cette façon votre carte ne doit pas être un HashMap si plus tard vous décidez de le changer.

+1

Pour expliquer ceci: utiliser == sur une paire de chaînes vérifie si elles sont ou non le même objet en mémoire. L'utilisation de a.equals (b) vérifie si les chaînes a et b contiennent exactement les mêmes caractères. Pour la plupart des comparaisons de chaînes, vous voulez .equals – DGH

+0

Merci pour la clarification! –

0

Une autre approche. Essayez utilisation HashMap<String, HashMap<String, Object>> main pour votre « extérieur » HashMap, puis vous effectuez une recherche pour key:

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

La réponse de Casablanca fonctionne plutôt bien. Merci pour votre réponse aussi. –