我正在寻找一个几乎完全是 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);
}
}
提前致谢附加信息:
{"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/