回答:
map.put(key, map.get(key) + 1);
大丈夫です。既存のマッピングの値を更新します。これはオートボクシングを使用していることに注意してください。助けを借りてmap.get(key)
、我々は、キーに対応する値を取得し、その後、あなたはあなたの要件を更新することができます。ここでは、値を1ずつ増やすように更新しています。
getOrDefault
例:map.put(key, count.getOrDefault(key, 0) + 1);
computeIfPresent
methodを使用してマッピング関数を提供できます。これは、既存の値に基づいて新しい値を計算するために呼び出されます。
例えば、
Map<String, Integer> words = new HashMap<>();
words.put("hello", 3);
words.put("world", 4);
words.computeIfPresent("hello", (k, v) -> v + 1);
System.out.println(words.get("hello"));
または、merge
メソッドを使用することもできます。ここで、1はデフォルト値であり、関数は既存の値を1ずつ増分します。
words.merge("hello", 1, Integer::sum);
加えて、このような他の有用な方法の束がありputIfAbsent
、getOrDefault
、forEach
、など
null
(たとえばwords.put("hello", null);
)である場合に一貫して機能null
せず1
、期待どおりの結果が得られません。
compute()
代わりに使用でき、null
値も処理します。
.merge
が、での解決策Integer::sum
です。
hashmap.put(key, hashmap.get(key) + 1);
このメソッドput
は既存のキーの値を置き換え、存在しない場合は作成します。
nullPointer Exception
。
null + 1
これはnull
整数にボックス化解除して増分を実行しようとするため、実行できません。
単純化されたJava 8の方法:
map.put(key, map.getOrDefault(key, 0) + 1);
これは、キーの値を取得するHashMapのメソッドを使用しますが、キーを取得できない場合は、指定されたデフォルト値(この場合は「0」)を返します。
これはコアJava内でサポートされています:HashMap <K、V> getOrDefault(Object key、V defaultValue)
置き換えInteger
てAtomicInteger
、その上でincrementAndGet
/ getAndIncrement
メソッドの1つを呼び出します。
別の方法は、メソッドを持つint
独自のMutableInteger
クラスでをラップするincrement()
ことです。これで解決できるのはスレッドセーフの懸念だけです。
MutableInteger
として、優れているAtomicInteger
用途volatile
のオーバーヘッドがあります。のint[1]
代わりに使用しますMutableInteger
。
1行のソリューション:
map.put(key, map.containsKey(key) ? map.get(key) + 1 : 1);
@マシューのソリューションは最もシンプルで、ほとんどの場合十分に機能します。
高いパフォーマンスが必要な場合、AtomicIntegerは@BalusCとしてより優れたソリューションです。
ただし、より高速なソリューション(スレッドの安全性が問題ではない場合)は、TObjectIntHashMapを使用することです。TObjectIntHashMapは、increment(key)メソッドを提供し、プリミティブを使用し、AtomicIntegerを作成するよりも少ないオブジェクトを使用します。例えば
TObjectIntHashMap<String> map = new TObjectIntHashMap<String>()
map.increment("aaa");
少し遅いかもしれませんが、ここに私の2セントがあります。
Java 8を使用している場合は、computeIfPresentメソッドを使用できます。指定されたキーの値が存在し、nullでない場合、キーとその現在のマッピングされた値を指定して、新しいマッピングを計算しようとします。
final Map<String,Integer> map1 = new HashMap<>();
map1.put("A",0);
map1.put("B",0);
map1.computeIfPresent("B",(k,v)->v+1); //[A=0, B=1]
別のメソッドputIfAbsentを使用してキーを置くこともできます。指定されたキーがまだ値に関連付けられていない(またはnullにマップされている)場合、このメソッドはそれを指定された値に関連付けてnullを返し、そうでない場合は現在の値を返します。
マップがスレッド間で共有されている場合はConcurrentHashMap
、AtomicIntegerを使用できます。ドキュメントから:
An
AtomicInteger
は、アトミックに更新できるint値です。AtomicIntegerは、アトミックに増分されるカウンターなどのアプリケーションで使用され、Integerの代わりとして使用することはできません。ただし、このクラスはNumberを拡張して、数値ベースのクラスを処理するツールやユーティリティによる均一なアクセスを可能にします。
以下のように使用できます。
final Map<String,AtomicInteger> map2 = new ConcurrentHashMap<>();
map2.putIfAbsent("A",new AtomicInteger(0));
map2.putIfAbsent("B",new AtomicInteger(0)); //[A=0, B=0]
map2.get("B").incrementAndGet(); //[A=0, B=1]
get
注意すべき点の1つは、keyの値を取得するためにB
呼び出してincrementAndGet()
から、その値(当然のことAtomicInteger
です)を呼び出すことです。メソッドputIfAbsent
がすでに存在する場合、キーの値を返すため、最適化できます。
map2.putIfAbsent("B",new AtomicInteger(0)).incrementAndGet();//[A=0, B=2]
余談ですが、AtomicLongの使用を計画している場合は、ドキュメンテーションのとおり、競合が多い状況で、LongAdderの予想スループットは大幅に高くなりますが、スペースの消費量が多くなります。この質問もチェックしてください。
評判が低いため、いくつかの回答にはコメントできないため、適用したソリューションを投稿します。
for(String key : someArray)
{
if(hashMap.containsKey(key)//will check if a particular key exist or not
{
hashMap.put(hashMap.get(key),value+1);// increment the value by 1 to an already existing key
}
else
{
hashMap.put(key,value);// make a new entry into the hashmap
}
}
キーが存在する場合、Hashtable putメソッドが既存の値を置き換えることを意味するという、この質問に対する誤解を招く答えがあります。これは、HashtableではなくHashMapに当てはまります。HashMapのJavadocを参照してくださいhttp://docs.oracle.com/javase/7/docs/api/java/util/HashMap.html#put%28K,%20V%29
Integer i = map.get(key);
if(i == null)
i = (aValue)
map.put(key, i + 1);
または
Integer i = map.get(key);
map.put(key, i == null ? newValue : i + 1);
整数はプリミティブデータタイプhttp://cs.fit.edu/~ryan/java/language/java-data.htmlであるため、取り出してプロセスを実行し、元に戻す必要があります。プリミティブデータ型ではない値がある場合は、それを取り出して処理するだけで、ハッシュマップに戻す必要はありません。
試してください:
HashMap hm=new HashMap<String ,Double >();
注意:
String->give the new value; //THIS IS THE KEY
else
Double->pass new value; //THIS IS THE VALUE
ハッシュマップのキーまたは値のいずれかを変更できますが、両方を同時に変更することはできません。
機能「computeIfPresent」に組み込まれたJava8を使用する
例:
public class ExampleToUpdateMapValue {
public static void main(String[] args) {
Map<String,String> bookAuthors = new TreeMap<>();
bookAuthors.put("Genesis","Moses");
bookAuthors.put("Joshua","Joshua");
bookAuthors.put("Judges","Samuel");
System.out.println("---------------------Before----------------------");
bookAuthors.entrySet().stream().forEach(System.out::println);
// To update the existing value using Java 8
bookAuthors.computeIfPresent("Judges", (k,v) -> v = "Samuel/Nathan/Gad");
System.out.println("---------------------After----------------------");
bookAuthors.entrySet().stream().forEach(System.out::println);
}
}