J'ai un Je veux maintenant aplatir cette carte, de sorte que toutes les entrées sont au même niveau: p> lorsque j'essaie p> comme Décrit dans cet article , je reçois l'erreur suivante: p> existe-t-il une manière générique pour aplatir tout autre nausé hashmap code> dans ce formulaire:
Mapper code>? P> p>
3 Réponses :
Vous devriez essayer ceci:
static Map<String, Object> flatMap(Map<String, Object> map) { Map<String, Object> flatenedMap = new HashMap<>(); map.forEach((key, value) -> { if(value instanceof Map) { flatenedMap.putAll(flatMap((Map) value)); } else { flatenedMap.put(key, value); } }); return flatenedMap; }
Et que faites-vous s'il y a plus que 2 couches de cartes imbriquées?
Il a écrit qu'il a nié HASHMAP, s'il a plus d'une couche d'imbrication, il serait préférable d'utiliser un alg récursif
@Lino en effet, ma mauvaise.
Je ne sais pas si j'ai bien compris la question correctement, mais quelque chose comme cela pourrait fonctionner. N'ayez pas encore vérifié toute la syntaxe, il pourrait donc y avoir une erreur quelque part quelque part.
Map<String, String> flattenedMap = flatten(yourmap) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
La méthode code> ExtractValue ne compile pas, un retour code> est manquant au cas où
si code> s échoue
@Chirlo oui parce que je ne sais pas vraiment ce que l'OP veut faire dans ce cas
Vous pouvez utiliser une méthode d'assistance récursive: qui peut ensuite être appelé comme ceci: p> J'ai Utilisé cette approche avec le biconsumer code> pour ne pas limiter la méthode pour n'aplatiser la carte imbriquée dans une autre carte, mais l'appelant peut décider de ce qu'il veut faire avec chaque paire de la valeur clé. P> p>
une fonction récursive avec un
instance de code> vérifier contre
carte code>, je suppose
Vous pouvez essayer d'utiliser Flatmap () à partir de Java Stream API
map.get ("key3") :: addall code> n'a aucun sens puisque vous semblez avoir une carte code>.
Je serais vraiment heureux que vous puissiez partager le type de votre carte
code> où le code que vous avez partagé fonctionne.
Quelles sont les paires de la valeur clé dans votre carte de hachage? Clé => Valeur, touche => Array, touche => Carte?
Même pour une carte qui permet à cette opération, qu'est-ce que c'est censé faire lorsque
carte.values (). Foreach (Map.get ("key3") :: addall); code> traite l'entrée pour
"Key3" code>?
Alors, quel est le type de votre carte
code>? Il ne peut pas être
mappe code> si certaines entrées sont
entrée> code>. Vous devez inclure le code pour que nous puissions comprendre ce que vous avez réellement.
@ user1170330 Ensuite, votre question n'a aucun sens et que vous ne travailliez pas avec une carte imbriquée alors. (ne me semble pas juste)
@Lino: Désolé, la carte "principale" est la carte, tout le contenu de cette carte Strings.
@ user1170330 Non, ils ne le sont pas. Vous dites vous-même que certains d'entre eux sont une carte
code>.
@nullpointer peut-être, mais ce que je voulais souligner, est-ce que
carte.values (). foreach (...) code> traitera toutes les entrées, y compris celle de l'OP. Cela finira donc par essayer d'ajouter une liste (ou une carte) à elle-même.