如何在Java哈希映射中键入一个值?

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路:

你可以使用的方法,它computeIfPresent和供应一个映射函数,这将是一个新的想compute值基于现有的一个。 </P >

例如, </P >

1
2
3
4
5
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"));

alternatevely,你可以使用merge方法,在1是默认值和函数的increments现有的值由1: </P >

1
words.merge("hello", 1, Integer::sum);

此外,有一个束对其他有用的方法,如putIfAbsentgetOrDefaultforEach,等。 </P >


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

该方法将putreplace函数的值的一个现有的密钥和威尔的创建,如果它不存在的T。 </P >


在简化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 IntegerAtomicInteger和一个呼叫的incrementAndGet/ getAndIncrement方法是它。 </P >

一种替代的是一套int在你自身的MutableInteger这类有一increment()方法,你有一个只读的threadsafety关注到的还没解决。 </P >


"马修的解决方案是将扩和足协参加了在大多数案件中。 </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是共享的跨线程然后,我们能让使用ConcurrentHashMap和atomicinteger。。。。。。。从文件: </P >

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 getto get value的密钥的方法B然后invoking incrementAndGet()是它的值,这是当然AtomicInteger。。。。。。。我们可以optimize它作为方法putIfAbsent时返回的值的密钥,如果已经出现: </P >

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


使用一个for回路的增值的指标: </P >

1
2
3
4
5
6
7
8
9
for (int i =0; i<5; i++){
    HashMap<String, Integer> map = new HashMap<String, Integer>();
    map.put("beer", 100);

    int beer = map.get("beer")+i;
    System.out.println("beer" + beer);
    System.out ....

}


由于名声不好,我无法对一些答案发表评论,所以我将发布一个我申请的解决方案。

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 >

1
HashMap hm=new HashMap<String ,Double >();

注: </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
Integer i = map.get(key);
if(i == null)
   i = (aValue)
map.put(key, i + 1);

或 </P >

1
2
Integer i = map.get(key);
map.put(key, i == null ? newValue : i + 1);

整数数据类型是原始的HTML cs.fit.edu / ~瑞恩/ / / java-data.html Java语言,所以你需要带出来,让一些过程,然后把它倒了。如果你有一个值,这是非原始数据类型,你只需要带出来的,它的工艺,所以需要把它倒在HashMap的热情。 </P >