Une façon similaire d'ajouter un nouvel élément à un vecteur comme en C ++: -
myValue = myHashMap.get(myKey); /**Check if the key exists **/ //If exists myValue.add(newElement); myHashmap.put(myKey, myValue);
La seule façon dont je peux penser en Java est d'obtenir le vecteur de hashmap. Ajoutez la nouvelle chaîne au vecteur, puis définissez à nouveau la clé avec le nouveau vecteur.
myHashMap[myKey].push_back(newElement); //push newElement to the value vector directly
La deuxième approche est-elle aussi rapide que la précédente et sinon, y a-t-il une autre approche ? Merci
3 Réponses :
Vous n'êtes pas obligé de remettre le vecteur dans la carte car vous modifiez déjà le vecteur lors de son ajout.
myHashMap.computeIfAbsent(key, k -> new Vector<>()) .add(newElement);
est réalisé par
myHashMap.get(myKey) .add(newElement);
(en supposant que myHashMap.get (myKey)
ne renvoie pas un null).
Vous pouvez utiliser computeIfAbsent dans l'interface Map pour construire un objet vectoriel pour une clé traitée pour la première fois. Ceci est plus élégant et ne nécessite pas de bloc if .
myHashMap[myKey].push_back(newElement);
La fonction ( k -> new Vector () ) n'est exécuté que si
myHashMap
n'a pas de mappage pour la clé key
. La bonne chose à ce sujet est qu'il renvoie la valeur vectorielle de key
afin que nous puissions enchaîner l'appel add
dessus.
Merci pour la réponse rapide. La deuxième approche semble très propre. Je ne savais pas que l'enchaînement était possible ici. Une autre question si cela ne vous dérange pas. Est-ce que get renvoie une référence à la valeur ou une modification directe n'est possible que via le chaînage.
Java est toujours appelé / passer par valeur . Mais la valeur est ici la référence (au vecteur). Ainsi, même avec get , vous pouvez obtenir le même résultat.
Notez que la deuxième solution n'est disponible qu'avec Java 8 et versions ultérieures. Mais c'est certainement la meilleure solution.
Vous pouvez faire cela de la même manière en java.
myHashMap.get (clé) .add (nouvelleValeur)
Parce que dans le hashmap, la référence de la liste (ou vous pouvez le dire vecteur) est stockée en tant que valeur. La modification du contenu de List n'influencera donc pas la référence. Vous pouvez imaginer que cette référence aime l'adresse 64 bits d'un vecteur en c ++.
Merci. Très appréciée. Je viens de découvrir la confusion pass-by-value et pass-by-reference en java. M'a aidé à comprendre ce problème.
Premièrement, si vous vous souciez des performances en Java, utilisez ArrayList
au lieu de Vector
. Comme le dit javadoc :
Depuis la plate-forme Java 2 v1.2, [
Vector
] a été modernisé pour implémenter l'interfaceList
, ce qui en fait un membre du Java Collections Framework. Contrairement aux nouvelles implémentations de collection,Vector
est synchronisé. Si une implémentation thread-safe n'est pas nécessaire, il est recommandé d'utiliserArrayList
à la place deVector
.
Donc, en supposant que nous utilisons Java 8 (et ArrayList
), il y a deux traductions pour le code C ++.
Version # 1. Fonctionne pour Java 5+
HashMap<String, ArrayList<String>> myMap = new HashMap<>(); ... myMap.computeIfAbsent(key, k -> ArrayList<>()).add(newElement);
Version # 2. Fonctionne pour Java 8+
HashMap<String, ArrayList<String>> myMap = new HashMap<>(); ... ArrayList<String> list = myMap.get(myKey); if (list == null) { list = new ArrayList<>(); myMap.put(myKey, list); } list.add(newElement);
Lequel sera le plus rapide? Vous auriez besoin de le tester pour être sûr, mais je pense que la deuxième version devrait être un peu plus rapide car elle évite la deuxième recherche de hashmap dans l'appel put
.
Et 1 la ligne de code est plus nette que 6 lignes. (YMMV pour la lisibilité. Cela dépend de la personne qui lit le code et de sa familiarité avec les fonctionnalités du langage Java 8+ et les API.)
Merci. En termes de performances, les deux suffiront. J'utilise Java 10 donc j'irai avec la deuxième approche car elle a l'air plus propre. J'étais confus parce que je ne savais pas qu'un pointeur sera renvoyé. Ce fil et ce fil ont dissipé ma confusion.
Quel est le type de
myHashMap
dans votre exemple de code C ++? Je veux savoir ... comparez-vous des pommes et des pommes?C'est la même chose que dans java. Carte>
En Java, vous devriez utiliser
ArrayList
plutôt queVector
. La classeVector
est héritée et a des frais de synchronisation que vous devriez éviter si vous le pouvez.Merci. Avait l'habitude d'utiliser des vecteurs provenant de C ++. Donnera un essai à
ArrayList