gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 03:41:58 25 4
gpt4 key购买 nike

我正在寻找一个几乎完全是 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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com