placer une valeur dans la carte en java *sans* la mise à jour de la valeur si elle existe
J'aimerais faire de la fonctionnalité suivante:
if (!map.contains(key)) {
map.put(key, val);
}
Mise à jour: imaginons qu'il n'est pas HashMap
si le plan est mis en œuvre comme un arbre d'une certaine sorte.
Cependant noter que c'est un peu inefficace, car si nous entrons dans l', si nous réellement de la recherche de la carte deux fois. J'aimerais vraiment faire quelque chose comme ça:
map.put_if_new_key(key, val);
Aucune idée de comment le faire en Java?
OriginalL'auteur Drakosha | 2011-12-09
Vous devez vous connecter pour publier un commentaire.
Si vous vous attendez à l'insertion de nouveaux éléments, une grande majorité de l'époque.
Je ne pense pas que c'est une bonne idée en général, mais il est utile d'envisager si vous pouvez raisonner suffisamment au sujet de votre cas d'utilisation.
Deuxième de la pensée sur ce si vous pouvez utiliser une carte en particulier, la mise en œuvre au lieu de simplement l'interface de la carte vous pouvez le faire avec un
NavigableMap
Depuis le sous-arbre sera 0 ou 1 nœuds gros il n'y a pas de travail répété.
même avec contient(clé), parce que, essentiellement, il vérifie si la clé est nulle, donc si vous définissez une clé null, puis vérifiez pour voir si il existe, il serait de retour à false, donc il n'y a vraiment aucun moyen de dire peu importe la méthode si la touche a été activée ou non.
Hein quoi? Ce n'est pas la façon dont il fonctionne.
contains()
ne retourne true si vous vraiment ajouté à la clé ( null) la carte n'est pas autrement - c'est la façon dont il est documenté, mais si vous ne croyez pas à la documentation, vous pouvez regarder à la mise en oeuvre. tout droit vers l'avant vraiment.OriginalL'auteur Sign
Si vous avez un
ConcurrentMap<K, V>
il y a la méthodeputIfAbsent
:Toutefois, cette méthode n'existe pas sur
Map<K, V>
.Notez cependant que Si l'OP est inquiet au sujet de la légère augmentation en regard deux-ups de la carte, la synchronisation coût sera bien pire.
Vrai. Mais si il utilise ConcurrentMap c'est sans doute parce qu'il besoins la synchronisation. Ça va coûter cher de la manière suivante: soit
putIfAbsent
oucontains
puisput
dans un bloc synchronisé. Et j'espère queputIfAbsent
est légèrement plus rapide.Vint de loin le pire, entendez-vous le 1/10 ième de un millième de seconde?
OriginalL'auteur Mark Byers
Je ne pense pas que votre code proposé est inefficace. Voir si
key
est déjà là dans la Carte son une carte unique. Et même pour le cas lorsque la clé n'est pas trouvé, il n'y a pas 2 recherches. Seulement 1 recherche et 1 insérer dans la Carte.L'arbre? De quel arbre? L'interface de la Carte ne garantit pas que les clés sont stockées dans un arbre - c'est un détail d'implémentation de implémentations. Ce que la mise en œuvre de la Carte que vous utilisez? À partir de votre question, il pourrait tout aussi facilement être un
HashMap
auquel cas il n'y a pas d'arbre et des principaux des recherches vont être extrêmement rapide (en moyenne).merci, j'ai mis à jour la question. Si ce n'est pas
HashMap
à l'aide de votre "inefficace" méthode va vous faire perdre des fractions de millisecondes, malheureusement, quel que soit le type de carte que vous utilisez, de toute façon qu'une mise en œuvre serait ajoutée serait pas plus lent que la vérification de l'extérieur, que de voir que c'est presque garanti que la méthode qu'ils utiliseraient pour vérifier si la clé n'existe pas, serait probablement le même que ce que vous pourriez faire pour créer la fonctionnalité. Si vous faites une Carte, a la fonctionnalité pour vérifier si une clé existe, et puis vous avez fait une méthode plus efficace pour la vérification de prévenir les écrase, ne serait-il pas de mise à jour de la méthode de contrôle la plus efficace méthode de trop?
OriginalL'auteur anubhava
Je ne pense pas qu'il y a moyen de contourner la vérification de la "contains()" pour voir si la clé existe ou pas.
Coup d'oeil ici pour voir si cela pourrait être une autre solution pour vous:
Ce qui se passe quand un double de la clé est mis dans une table de hachage?
OriginalL'auteur paulsm4