-1
votes

Comment aplatir un hashmap?

J'ai un nausé hashmap dans ce formulaire: xxx

Je veux maintenant aplatir cette carte, de sorte que toutes les entrées sont au même niveau: xxx


lorsque j'essaie xxx

comme Décrit dans cet article , je reçois l'erreur suivante: xxx


existe-t-il une manière générique pour aplatir tout autre Mapper ?


11 commentaires

une fonction récursive avec un instance de vérifier contre carte , je suppose


Vous pouvez essayer d'utiliser Flatmap () à partir de Java Stream API


map.get ("key3") :: addall n'a aucun sens puisque vous semblez avoir une carte .


Je serais vraiment heureux que vous puissiez partager le type de votre carte 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); traite l'entrée pour "Key3" ?


Alors, quel est le type de votre carte ? Il ne peut pas être mappe si certaines entrées sont entrée > . 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 .


@nullpointer peut-être, mais ce que je voulais souligner, est-ce que carte.values ​​(). foreach (...) 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.


3 Réponses :


0
votes

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


3 commentaires

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.



5
votes

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


2 commentaires

La méthode ExtractValue ne compile pas, un retour est manquant au cas où si s échoue


@Chirlo oui parce que je ne sais pas vraiment ce que l'OP veut faire dans ce cas



1
votes

Vous pouvez utiliser une méthode d'assistance récursive: xxx

qui peut ensuite être appelé comme ceci: xxx

J'ai Utilisé cette approche avec le biconsumer 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é.


0 commentaires