java hashmap更新值_如何更新一个值,给定一个java hashmap中的键?

map.put(key, map.get(key) + 1);

应该没事。 它将更新现有映射的值。 请注意,这使用自动装箱。

hashmap.put(key, hashmap.get(key) + 1);

put方法将取代现有密钥的值,如果不存在,将会创build它。

Java 8的方式:

您可以使用computeIfPresent方法并为其提供一个映射函数,该函数将根据现有函数调用一个新值。

例如,

Map 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等。

用AtomicIntegerreplaceInteger ,然后调用其中的一个incrementAndGet / getAndIncrement方法。

另一种方法是在你自己的MutableInteger类中包含一个int ,该类有一个increment()方法,但你只有一个线程安全问题需要解决。

@马修的解决scheme是最简单的,并且在大多数情况下都会performance出色。

如果您需要高性能,AtomicInteger是更好的解决schemeala @BalusC。

然而,更快的解决scheme(提供线程安全性不是问题)是使用TObjectIntHashMap ,它提供了一个增量(键)方法,并使用基元和less于创buildAtomicIntegers的对象。 例如

TObjectIntHashMap map = new TObjectIntHashMap() map.increment("aaa");

您可以像下面那样增加,但是您需要检查是否存在,以便不抛出NullPointerException

if(!map.containsKey(key)) { p.put(key,1); } else { p.put(key, map.getKey()+1); }

一行解决scheme:

map.put(key, map.containsKey(key) ? map.get(key) + 1 : 1);

简化的Java 8方式:

map.put(key, map.getOrDefault(key, 0) + 1);

这使用HashMap的方法来检索一个键的值,但是如果键不能被检索,它将返回指定的默认值(在这个例子中是'0')。

核心Java支持以下内容: HashMap getOrDefault(Object key,V defaultValue)

哈希是否存在(以0作为值)还是在第一个增量中“放”到地图? 如果它是“放”在第一个增量,代码应该是这样的:

if (hashmap.containsKey(key)) { hashmap.put(key, hashmap.get(key)+1); } else { hashmap.put(key,1); }

可能有点晚,但这是我的两分钱。

如果您正在使用Java 8,则可以使用computeIfPresent方法。 如果指定键的值存在且非空,则尝试计算给定键和其当前映射值的新映射。

final Map 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 。 从文档:

AtomicInteger是一个可以自动更新的int值。 AtomicInteger用于primefaces递增计数器等应用程序,不能用作Integer的替代品。 然而,这个类扩展了Number,允许使用基于数字的类的工具和实用程序进行统一访问。

我们可以使用它们,如图所示:

final Map 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来得到关键字B的值,然后调用incrementAndGet()的值,当然这个值是AtomicInteger 。 我们可以优化它,因为putIfAbsent方法在已经存在的情况下返回键的值:

map2.putIfAbsent("B",new AtomicInteger(0)).incrementAndGet();//[A=0, B=2]

在附注中,如果我们打算使用AtomicLong,那么根据高争用情况下的文档, LongAdder的预期吞吐量要高得多,代价是空间消耗更高。 另外检查这个问题 。

使用for循环来增加索引:

for (int i =0; i<5; i++){ HashMap map = new HashMap(); map.put("beer", 100); int beer = map.get("beer")+i; System.out.println("beer " + beer); System.out .... }

这个问题有误导性的答案,这意味着Hashtable的put方法将取代现有的值,如果存在的话,这不是真的Hashtable,而是HashMap。 查看Javadoc的HashMap http://docs.oracle.com/javase/7/docs/api/java/util/HashMap.html#put%28K,%20V%29

尝试:

HashMap hm=new HashMap();

注意:

String->give the new value; //THIS IS THE KEY else Double->pass new value; //THIS IS THE VALUE

您可以更改hashmap中的键或值,但不能同时更改这两个值。

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);

整数是原始数据typeshttp://cs.fit.edu/~ryan/java/language/java-data.html ,所以你需要把它拿出来,做一些过程,然后把它放回去。 如果你有一个不是Primitive数据types的值,你只需要把它拿出来处理它,不需要把它放回hashmap。

由于缺乏口碑,我不能评论几个答案,所以我会发布一个我申请的解决scheme。

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 } }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值