6
votes

HashMap Copiez toutes les touches dans HASHMAP et initialiser les valeurs à zéro

Quel est le meilleur moyen?

Il suffit de boucler et de mettre la clé et de zéro, ou existe-t-il une autre méthode de bibliothèque plus élégante ou existante. J'utilise également la bibliothèque de Google Guava Java si cela a une fonctionnalité utile?

voulait vérifier s'il y avait quelque chose de similaire à la méthode de copie des listes, ou de la carte Portall Méthode, mais juste pour les clés.


3 commentaires

S'il vous plaît, reformulez votre question, je ne pouvais pas le comprendre.


Je voudrais juste boucler à travers les clés, cela ne prendrait que trois lignes de code. Si vous le souhaitez plus court, vous pouvez écrire une méthode pour le faire.


Notez que si vous utilisez un multiset au lieu d'une carte, vous n'avez pas à initialiser toutes les clés à zéro. La première fois que vous ajoutez un nombre quelconque d'occurrences d'une nouvelle clé, elle l'initialisera pour vous.


3 Réponses :


1
votes
final Integer ZERO = 0;

for(String s : input.keySet()){
   output.put(s, ZERO);
}

4 commentaires

Pourquoi créer une constante nommée zéro? S'il n'ajoute pas de sens à la valeur, pourquoi ne pas utiliser 0?


@Isac: Pas sûr mais n'éteignez pas Integer.Valueof (0) être évalué pour chaque boucle?


@Isac: À peu près sûr que ce soit pour éviter de boxer chaque itération, ce qui peut être légèrement meilleur en termes de performance. Je n'ai pas envie de la clarté réduite.


Oui, mais alors? Il est inliné par le compilateur JIT dans la valeur cache 0 à chaque fois.



21
votes

Ne pensez pas qu'il y a beaucoup de besoin de quelque chose de fantaisie ici: xxx pré>

Si vous voulez quelque chose de fantaisie avec GUAVA, il y a cette option: p>

Map<String, Integer> newMap = Maps.newHashMap(
    Maps.transformValues(map, Functions.constant(0)));

// 1-liner with static imports!
Map<String, Integer> newMap = newHashMap(transformValues(map, constant(0)));


0 commentaires

3
votes

La boucle est assez facile (et non inélégante). Itérate sur les clés de l'original carte code> et mettez-la dans la nouvelle copie avec une valeur de zéro.

Set<String> keys = original.keySet();
Map<String, Integer> copy = new HashMap<String, Integer>();
for(String key : keys) {
    copy.put(key, 0);
}


3 commentaires

Utilisation de nouvel entier (0) est très inutile du tas. Considérez en utilisant 0 et laissez le travail d'autoboxage, ou si vous détertissez autoboxyage, utilisez integer.valueof (0) .


J'essayais juste de donner une réponse simple. Et l'autoboxing est la même chose que le nouveau entier (0), n'est-ce pas? Oui, Integer.Valueof (0) utiliserait moins de mémoire.


Nope, il fait integer.valueof (0) (qui utilise des valeurs en boîte mises en cache pour les nombres entre -128 et 127).