Java - est de l'ajout d'une clé/valeur d'une carte à l'intérieur d'une carte en 1 ligne de code possible?
J'ai HashMap 1, qui contient 5 touches, qui ont Hashmaps en tant que valeurs. Je veux ajouter des paires clé/valeur à ces sous-Cartes.
map1.get(subCategoryMap).put(newKey, newValue);
Ma pensée est:
map1.get(subCategoryMap);
renvoie une autre carte. J'ai pu partager cette ligne en deux lignes et disposent de:
map2 = map1.get(subCategoryMap);
map2.put(newKey, newValue);
Je préfèrerais le faire en une seule étape. C'est pourquoi je suis en train
map1.get(subCategoryMap).put(newKey, newValue);
Cela ne fonctionne pas (n'aime pas .put() sur un objet). Est-il possible d'accéder à la sous-Carte et l'ajouter dans la même ligne de code comme je suis au-dessus, ou dois-je besoin de le diviser en 2 lignes?
Juste un commentaire, quand je vois les cartes de cartes de ce qui est normalement un code-odeur qui indique qu'il convient de définir vos propres classes qui représentent la structure des données.
Il ne devrait pas être fermé. C'est une question valable. Cependant, vous devez accepter la réponse qui est la plus proche de votre solution, ou de poster une réponse, attendez quelques jours, et l'accepter.
Il ne devrait pas être fermé. C'est une question valable. Cependant, vous devez accepter la réponse qui est la plus proche de votre solution, ou de poster une réponse, attendez quelques jours, et l'accepter.
OriginalL'auteur Tony Stark | 2009-09-01
Vous devez vous connecter pour publier un commentaire.
Avec les médicaments génériques, vous pouvez:
Si les cartes ne sont pas génériques:
OriginalL'auteur cletus
Ou, utiliser des génériques:
Cependant, les deux techniques échouent avec
NullPointerException
simap1
ne contient pas de cartographie poursubCategoryMap
.OriginalL'auteur Andrew Duffy
Juste un aparté (je ferais ce qu'un commentaire, mais je pense que ça va être un peu long)...
Il sent très bon pour un programmeur pour être en mesure d'obtenir une seule opération conceptuelle sur une seule ligne. Pour le programmeur (à l'époque), il se sent plus lisible, logique et semble bon.
Il n'est presque jamais une bonne chose. Pour une chose, plus tard il sera plus difficile à analyser que deux lignes, même si votre réaction instinctive est maintenant que c'est plus lisible. Aussi-le plus grand nombre d'opérations sur une seule ligne, plus il est difficile à déboguer.
Pour des raisons de lisibilité, je dirais que les Génériques solution est à peu près aussi bien que je l'avais mis sur une seule ligne, pour la coulée de la solution que j'avais de le décomposer en deux lignes; je voudrais aussi décomposer en plusieurs lignes si l'un des paramètres ont été des opérations, au lieu de simples variables.
Je sais que beaucoup de gens ne seront pas d'accord avec cela et pour vous dire la vérité, j'ai tendance à mettre un peu sur une ligne à la première, mais ce que j'ai remarqué, c'est qu'au premier signe de difficulté ou de toute confusion, il me rend la vie plus facile à tout casser vers le bas dans des déclarations séparées clairement les variables nommées.
Au moins aussi important-dans les cas avec les collections imbriquées, je vais souvent envelopper les collections dans un autre objet. Ce serait intéressant dans votre cas, l'appel serait de devenir un peu plus clair.
Cache la mécanique de l'imbrication des collections (qui, autrement, peuvent être complexes à mémoriser correctement et facile à visser) et rend votre intention beaucoup plus claire.
Ce modèle d'emballage (qui ne s'étend Pas mais encapsulation) les collections imbriquées se sent étrange au premier abord, mais je suggère que vous venez de lui donner un essai--c'est vraiment nettoie BEAUCOUP de code, rend tout beaucoup plus sûr s'ajoute à tout le monde de la compréhension de l', les changements d'une "Collection" d'un objet métier (où vous pouvez placer des méthodes d'affaires--un refactoring vous apprécierez presque immédiatement), et généralement aide de votre code partout.
Oui, dataHolder contiendrait la imbriqués les collections que vous avez suggéré. Ceci impose la structure en le protégeant contre les malentendus et les manipulations illégales. Il vous permet également de re-mettre en œuvre la structure de données sans toucher l'API.
OriginalL'auteur Bill K
Si vous n'utilisez pas les Génériques, puis une HashMap stocke et récupère les clés et les valeurs de l'Objet, de sorte que vous pourriez avoir besoin de jeter, qui ressemblerait à quelque chose comme ceci:
Toutefois, il serait utile si vous avez fourni plus de code.
OriginalL'auteur Thomas Owens
Si vous utilisez Générique collections, puis votre code devrait fonctionner comme à l'écrit. Sinon, vous devez ajouter dans le fait que votre seule ligne.
OriginalL'auteur Powerlord
Tant que
map1
est déclaré quelque chose commeMap<OuterKey, Map<InnerKey, MyValue>>
, une doublure de travail. Cependant, vous devez être prudent au sujet de ce qui se passe sisubCategoryMap
n'existe pas dansmap1
—un one-liner de soulever unNullPointerException
.OriginalL'auteur erickson
Fonctionne très bien si vous utiliser des génériques:
OriginalL'auteur Fabian Steeg
Vous pouvez utiliser
((HashMap)map1.get(subCategoryMap)).put(newKey, newValue);
Aussi, si vous utilisez Java 5 ou Java 6, vous pouvez utiliser générique pour éviter la fonte dans
HashMap
OriginalL'auteur Nettogrof