java - HashMap<String,Integer> 数据结构,但值是添加而不是替换

标签 java hashmap

我正在寻找一个几乎完全是 HashMap<String,Integer> 的数据结构,但是 HashMaps 的问题在于,由于 putAll()putVal() 的替换行为,在两个 HashMap 上调用 line 655 方法会丢失存储在键值对中的大部分数据java/util/HashMap.java 的。
这基本上是我想要的改变:

    if (e != null) { // existing mapping for key
         V oldValue = e.value;
         if (!onlyIfAbsent || oldValue == null)
--            e.value = value;
++            e.value = value + oldValue;
         afterNodeAccess(e);
         return oldValue;
    }
是否有我忽略的现有数据结构会做这样的事情,或者我如何创建一个基本上是 HashMap 的类并进行更改?
我已经尝试编写一些代码,但没有按照我想要的方式工作......事实上,如果我在 @Override 上设置 put 方法,这样做,或者完全删除它都没有关系 -替换行为当然保持不变,因为 putAll() 使用了我无法从外部访问/更改的 putVal() - 或者我至少不知道如何......
 /**
  * doesn't work, putAll() uses putVal() that I can't reach
  */
 public class SumHashMap<K> extends HashMap<K, Integer> {
    private static final long serialVersionUID = 1L;

    public Integer put(K key, Integer value) {
        Integer oldValue = get(key);
        if (oldValue == null)
            return super.put(key, value);
        return super.put(key, oldValue + value);
    }
}
提前致谢
附加信息:
  • 我想使用 putAll() 函数来减少来​​自自定义 HashMap 的流。
  • 如果我有两个这种 {"key1" : 2, "key3" : 4}{"key3" : 1} 的自定义 HashMap,那么 a.putAll(b) 的结果应该是 {"key1" : 2, "key3" : 5}
  • 最佳答案

    我想这就是你要找的。我这样做是为了使 key 可以是任何类型。如果需要,您可以删除键的泛型并只扩展 HashMap

    import java.util.HashMap;
    import java.util.Map;
    
    public class AddingHashMap<K> extends HashMap<K, Integer> {
        @Override
        public Integer put(K key, Integer value) {
            Integer existingValue = super.get(key);
            if (existingValue == null) {
                existingValue = value;
            } else {
                existingValue = existingValue.intValue() + value.intValue();
            }
            return super.put(key, existingValue);
        }
    
        @Override
        public void putAll(Map<? extends K, ? extends Integer> m) {
            m.entrySet().forEach(entry -> {
                this.put(entry.getKey(), entry.getValue());
            });
        }
    }
    
    这是它的工作:
    public static void main(String[] argv) {
            AddingHashMap<String> myAddingHashMap = new AddingHashMap<>();
            myAddingHashMap.put("One", 1);
            myAddingHashMap.put("Two", 2);
            myAddingHashMap.put("One", 3);
    
            myAddingHashMap.entrySet().forEach(entry -> System.out.println(entry.getKey() + " - " + entry.getValue()));
        }
    
    输出:
    One - 4
    Two - 2
    
    稍后编辑:请记住,这不是线程安全的。

    关于java - HashMap<String,Integer> 数据结构,但值是添加而不是替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65875712/

    相关文章:

    java - 为什么 HashSet 的内部实现创建一个 HashMap 来存储它的值?

    java - HashMap 到 Json 数组对象 - Java

    java:检查HashMap值中是否存在对象的属性

    java - 序列化 HashMap 但输入文本文件会在每次程序运行时清除自身。 -- java

    java - 新用户创建通知邮件不会在 Alfresco 中发送

    java - 32 位和 64 位版本(其他依赖项)以及 Maven 中的构建生命周期

    java - 错误提示 "Bad version in .class file"

    java - Map 上的集合操作

    java - 用于跨程序复制/粘贴的用户定义字符串

    java - 如何使用注释保存将列表作为值的 map ?