HashMap按照分组 (Java)

3
有没有一种方法可以在Java中按键进行分组,并将值添加到HashMap中?
    HashMap<String, Integer> map = new HashMap<String, Integer>();

    map.put("A", 2);
    map.put("A", 3);
    map.put("B", 4);
    map.put("A", 5);
    map.put("B", 4);    

结果是:
   A = 10
   B = 8

任何帮助都将是有益的!!!

6
在执行操作时,检查元素是否存在,如果存在则添加并更新。 - Amit Deshpande
请解释一下您想要的输出内容。 - Code-Apprentice
是的,使用if语句和map.containsKey方法即可完成。 - goat
5个回答

5

可以尝试以下内容:

public void incrementValue(HashMap<String, Integer> map, String key, int value) {
    Integer old = map.get(key);
    if (old == null) {
        map.put(key, value);
    } else {
        map.put(key, value + old);
    }
}

4
编写一个实用方法来完成以下操作:
Map<String, Integer> map = new HashMap<>();
.........
public void putAndIncrement(String key, int value) {
    Integer prev = map.get(key);
    Integer newValue = value;
    if (prev != null) {
        newValue += prev.intValue();
    }
    map.put(newValue);
}

如果您想访问所有的值,可能下一次需要用于乘法,该怎么办? - Jayy
@KaipaMSarma 那么你的解决方案更好。然而,这似乎不是OP的问题。 - Zach Langley
1
@ZachLangley 的问题实际上是关注如何根据键值对进行分组。我的感觉是,在分组时,解决方案应该保留所有的值,以便支持对这些值进行任何操作。 - Jayy

3

不应该使用哈希表。

map.put("A", 2);
map.put("A", 3);

第二个put覆盖了第一个put。使用列表,循环遍历并自行执行加法操作。

2
你可以通过以下方式进行分组:
HashMap<String, ArrayList<Integer>>

每当你看到A时,就将其值添加到其ArrayList中。

1
这需要O(n)的时间来检索总和。 - Zach Langley

0

请查看Java算法跟踪聚合值的部分的答案:

private static class MutableValue {
    double value;
    public MutableValue(double value) {
        this.value = value;
    }
    public void add(double value) {
        this.value += value;
    }
}

MutableValue value = sourceNameMap.get(ticketId);
if (oldValue == null) {
    sourceNameMap.put(new MutableValue(entryValue));
} else {
    value.add(entryValue);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接