Wie aktualisiert man einen Wert, wenn man einen Schlüssel in einem Java hashmap verwendet?
Nehmen wir an, wir haben eine HashMap<String, Integer>
in Java.
Wie kann ich update (Inkrement) der integer-Wert des string-Schlüssel für jeden Existenz der Zeichenfolge finde ich?
Könnte man entfernen, und geben Sie die pair-Mädchen, aber Aufwand wäre ein Anliegen.
Eine andere Möglichkeit wäre, einfach die neues paar und das alte ersetzt werden würde.
Im letzteren Fall, was passiert, wenn es einen hashcode Kollision mit einem neuen Schlüssel, den ich versuche zu legen?? Das richtige Verhalten für eine hashtable wäre, weisen einen anderen Platz für Sie, oder machen Sie eine Liste, aus der es in der gegenwärtigen Periode.
InformationsquelleAutor der Frage laertis | 2010-11-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
sollte in Ordnung sein. Es wird aktualisieren Sie den Wert für die Zuordnung aus. Beachten Sie, dass diese verwendet auto-boxing.
InformationsquelleAutor der Antwort Matthew Flaschen
Java 8 Weg:
Können Sie
computeIfPresent
Methode und stellen Sie es eine mapping-Funktion, welche aufgerufen wird, um zu berechnen einen neuen Wert auf der Basis des vorhandenen.Beispielsweise
Alternatevely, Sie könnte verwenden
merge
- Methode, wobei 1 der Standardwert ist und die Funktion inkrementiert aktuellen Wert um 1:Darüber hinaus gibt es eine Reihe von anderen nützlichen Methoden, wie
putIfAbsent
getOrDefault
forEach
usw.InformationsquelleAutor der Antwort damluar
Die Methode
put
wird ersetzen den Wert eines vorhandenen Schlüssels und wird es schaffen, wenn nicht vorhanden.InformationsquelleAutor der Antwort oracleruiz
Ersetzen
Integer
durchAtomicInteger
und rufen Sie eine derincrementAndGet
/getAndIncrement
Methoden auf.Ist eine alternative zum wickeln eines
int
im eigenenMutableInteger
Klasse, die hat eineincrement()
Methode, Sie haben nur eine threadsafety Anliegen zu lösen waren.InformationsquelleAutor der Antwort BalusC
@Matthew ' s Lösung ist die einfachste und auch durchführen zu können reicht in den meisten Fällen.
Wenn Sie eine hohe Leistung, AtomicInteger ist eine bessere Lösung ala @BalusC.
Jedoch eine schnellere Lösung (vorausgesetzt, thread-Sicherheit ist nicht ein Problem), ist die Verwendung TObjectIntHashMap die ein Inkrement(key) - Methode und verwendet primitive und weniger Objekte als die Schaffung AtomicIntegers. z.B.
InformationsquelleAutor der Antwort Peter Lawrey
Vereinfachten Java 8 Weg:
Dies nutzt die Methode von HashMap, die ruft den Wert für einen Schlüssel, aber wenn der Schlüssel kann nicht abgerufen werden, es gibt die angegebene default-Wert (in diesem Fall eine '0').
Unterstützt wird dies in Kern-Java: getOrDefault(Object key, V defaultValue)">HashMap<K V> getOrDefault(Object key, V defaultValue)
InformationsquelleAutor der Antwort Christopher Bull
One-line-Lösung:
InformationsquelleAutor der Antwort Punktum
Können Sie Inkrementieren, wie unten, aber Sie brauchen, um zu überprüfen, auf die Existenz, so dass eine NullPointerException ausgegeben,
InformationsquelleAutor der Antwort isuru
Funktioniert der hash vorhanden ist (mit 0 als Wert) oder ist es "put", um die Karte auf das erste Inkrement? Wenn es "put", auf der ersten Schrittweite, sollte der code so Aussehen:
InformationsquelleAutor der Antwort sudoBen
Kann es sein, etwas spät aber hier sind meine zwei Cent.
Wenn Sie mit Java 8 dann können Sie Gebrauch machen von computeIfPresent Methode. Wenn der Wert für den angegebenen Schlüssel vorhanden ist und nicht-null-dann versucht er zu berechnen, eine neue Zuordnung gegeben, die Schlüssel und den aktuellen Wert zugeordnet.
Können wir auch eine andere Methode putIfAbsent , setzen Sie einen Schlüssel. Wenn der angegebene Schlüssel ist nicht schon einem Wert zugeordnet sind (oder zugeordnet ist null) diese Methode verbindet Sie mit dem angegebenen Wert und gibt null zurück, sonst gibt den aktuellen Wert.
Fall, dass die Karte genutzt wird, threads, dann können wir nutzen
ConcurrentHashMap
und AtomicInteger. Von der doc:Können wir Sie wie folgt:
Einem Punkt zu beachten ist, dass wir die Berufung
get
um den Wert für den SchlüsselB
und dann aufrufenincrementAndGet()
auf seinen Wert, das ist natürlichAtomicInteger
. Wir optimieren können, es als die MethodeputIfAbsent
gibt den Wert für den Schlüssel (falls bereits vorhanden:On a side note, wenn wir verwenden möchten AtomicLong dann als pro-Dokumentation unter hohem Konflikte zu erwartenden Durchsatz von LongAdder ist deutlich höher, auf Kosten der höheren Verbrauch von Platz. Überprüfen Sie auch diese Frage.
InformationsquelleAutor der Antwort i_am_zero
Die sauberere Lösung ohne NullPointerException ist:
InformationsquelleAutor der Antwort Sergey Dirin
Verwenden
for
Schleife zu Inkrementieren des index:InformationsquelleAutor der Antwort VanHoutte
Gibt es irreführende Antworten auf diese Frage hier bedeuten, dass Hashtable-put-Methode angewendet wird, ersetzen Sie den vorhandenen Wert, wenn der Schlüssel vorhanden ist, gilt dies nicht für Hashtable, sondern vielmehr für die HashMap. Siehe Javadoc für HashMap http://docs.oracle.com/javase/7/docs/api/java/util/HashMap.html#put%28K,%20V%29
InformationsquelleAutor der Antwort user1048218
Versuchen:
HINWEIS:
Ändern können Sie entweder den Schlüssel oder den Wert in der hashmap, aber Sie können nicht ändern, die beide zur gleichen Zeit.
InformationsquelleAutor der Antwort NARAYANAN.M
oder
Ganzzahligen Primitiven Datentypen http://cs.fit.edu/~ryan/java/language/java-data.htmlso müssen Sie nehmen Sie es aus, machen Sie etwas verarbeiten, dann wieder zurück. wenn Sie einen Wert haben, die nicht-Primitive Datentypen, Sie müssen nur, es zu nehmen, zu verarbeiten, keine Notwendigkeit, um es wieder in die hashmap.
InformationsquelleAutor der Antwort Kreedz Zhen
Da kann ich nicht kommentieren, um ein paar Antworten wegen zu wenig Ruf, ich werde nach einer Lösung, die ich angewendet.
InformationsquelleAutor der Antwort aayush nigam