How to update a value, given a key in a java hashmap?
假设我们在Java中有一个EDCOX1 0Ω。
对于我找到的每个字符串,如何更新(递增)字符串键的整数值?
我们可以移除并重新输入这对代码,但是开销是一个问题。另一种方法就是把新的和旧的换掉。
在后一种情况下,如果哈希代码与我要插入的新键发生冲突,会发生什么情况?哈希表的正确行为是为它分配一个不同的位置,或者在当前bucket中列出一个列表。
1 | map.put(key, map.get(key) + 1); |
应该是好的。它将更新的值的方法的现有的映射。值得注意的是,这可以用于自动装箱。 </P >
Java的8路:
你可以使用的方法,它
例如, </P >
1 2 3 4 5 |
alternatevely,你可以使用
1 |
此外,有一个束对其他有用的方法,如
1 | hashmap.put(key, hashmap.get(key) + 1); |
该方法将
在简化Java 8路: </P >
1 | map.put(key, map.getOrDefault(key, 0) + 1); |
本研究使用的方法,retrieves HashMap的价值的一个关键,但如果密钥不可能是它的specified retrieved时返回默认值(在这个案例的一个"0")。 </P >
这是一支在Java核心:getordefault & # 40;面向关键参数的默认值,V和# 41;"> < HashMap K,V>getordefault & # 40;面向关键参数的默认值,V和# 41; </P >
replace
一种替代的是一套
"马修的解决方案是将扩和足协参加了在大多数案件中。 </P >
如果你需要的高性能,atomicinteger是一个更好的解决方案的基础balusc"。 </P >
但是,在一个更快的解决方案(提供线程安全性是不安的问题),这是使用tobjectinthashmap提供增值的(关键)的方法和使用的primitives和不大于atomicintegers对象的创建。辩护人。 </P >
1 2 | TObjectIntHashMap<String> map = new TObjectIntHashMap<String>() map.increment("aaa"); |
一个在线的解决方案: </P >
1 | map.put(key, map.containsKey(key) ? map.get(key) + 1 : 1); |
你可以像下面的资源,但你需要check for a null时抛出的存在,这是不thrown </P >
1 2 3 4 5 6 | if(!map.containsKey(key)) { p.put(key,1); } else { p.put(key, map.getKey()+1); } |
不存在(用的哈希值为0),或是它的"把"的LSP是第一资源吗?如果它是"把"是第一资源,应该看样的代码: </P >
1 2 3 4 5 | if (hashmap.containsKey(key)) { hashmap.put(key, hashmap.get(key)+1); } else { hashmap.put(key,1); } |
它可能会在小晚,但这里是我的两美分。 </P >
如果你是使用Java 8,那么你可以让computeifpresent的使用方法。如果值为specified key is present和非零,那么它的尝试一种新的compute映射到给定的密钥和其当前的定位转矩值。 </P >
1 2 3 4 | 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 to put a的密钥。如果specified密钥是不是已经伴A值(或是定位转矩的零),然后这个方法,将它与给定的值的和时返回零,否则电流时返回的值。 </P >
在案例中的LSP是共享的跨线程然后,我们能让使用
An
AtomicInteger is an int value that may be updated atomically. An
AtomicInteger is used in applications such as atomically incremented
counters, and cannot be used as a replacement for an Integer. However,
this class does extend Number to allow uniform access by tools and
utilities that deal with numerically-based classes.
我们可以使用它们作为节目: </P >
1 2 3 4 | 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] |
的一点是要守的是我们的invoking
1 | map2.putIfAbsent("B",new AtomicInteger(0)).incrementAndGet();//[A=0, B=2] |
值得注意的是,如果我们的债券计划的使用atomiclong则为每个文件在争用的高预期的高通量的研究longadder是明显更高,在expense高级消费空间。也检查了这个问题。 </P >
不带NullPointerException的清理解决方案是:
1 | map.replace(key, map.get(key) + 1); |
使用一个
1 2 3 4 5 6 7 8 9 |
由于名声不好,我无法对一些答案发表评论,所以我将发布一个我申请的解决方案。
1 2 3 4 5 6 7 8 9 10 11 | 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 } } |
这是misleading回答到这个问题就在这里,那imply哈希表的put方法将现有的字符串value if exists的密钥,这是不真实的,但对哈希表中,而HashMap的方法。看javadoc的HashMap的http:/ / / docs.oracle.com JavaSE 7 / / / Java API文档/利用/ hashmap.html # put依赖% % % 29,20V的 </P >
使用java8内置功能"computeifpresent"
例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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); } } |
尝试: </P >
注: </P >
1 2 3 | String->give the new value; //THIS IS THE KEY else Double->pass new value; //THIS IS THE VALUE |
你不能改变either的键或值的在你的HashMap,但是你不能改变都在同一时间。 </P >
1 2 3 4 |
或 </P >
1 2 |
整数数据类型是原始的HTML cs.fit.edu / ~瑞恩/ / / java-data.html Java语言,所以你需要带出来,让一些过程,然后把它倒了。如果你有一个值,这是非原始数据类型,你只需要带出来的,它的工艺,所以需要把它倒在HashMap的热情。 </P >