重写map的put方法让相同key的value相加
时间: 2024-01-21 10:19:04 浏览: 118
白色大气风格的旅游酒店企业网站模板.zip
可以通过继承AbstractMap类并重写put方法来实现相同key的value相加的功能。具体实现如下:
```java
import java.util.AbstractMap;
import java.util.Map;
public class SummingMap<K, V extends Number> extends AbstractMap<K, V> {
private final Map<K, V> map;
public SummingMap(Map<K, V> map) {
this.map = map;
}
@Override
public V put(K key, V value) {
V oldValue = map.get(key);
if (oldValue == null) {
return map.put(key, value);
}
V newValue = sum(oldValue, value);
return map.put(key, newValue);
}
private V sum(V oldValue, V value) {
if (oldValue instanceof Double || value instanceof Double) {
return (V) Double.valueOf(oldValue.doubleValue() + value.doubleValue());
} else if (oldValue instanceof Float || value instanceof Float) {
return (V) Float.valueOf(oldValue.floatValue() + value.floatValue());
} else if (oldValue instanceof Long || value instanceof Long) {
return (V) Long.valueOf(oldValue.longValue() + value.longValue());
} else {
return (V) Integer.valueOf(oldValue.intValue() + value.intValue());
}
}
@Override
public Set<Entry<K, V>> entrySet() {
return map.entrySet();
}
}
```
在put方法中,首先获取当前key对应的旧值,如果旧值为null,则直接将新值加入map中;否则,计算出新值,并用新值替换旧值。
需要注意的是,value需要是Number的子类才能进行加法操作。由于加法可能涉及到不同类型的Number,因此在sum方法中进行了类型判断和转换。
使用时,可以将原始的Map传入SummingMap的构造函数中,即可得到一个支持相同key的value相加的Map。例如:
```java
Map<String, Integer> map = new HashMap<>();
map.put("a", 1);
map.put("b", 2);
map.put("a", 3);
Map<String, Integer> summingMap = new SummingMap<>(map);
summingMap.put("a", 4);
System.out.println(summingMap); // 输出 {a=7, b=2}
```
在这个例子中,原始的map中有两个key为"a"的值,分别为1和3。将原始map传入SummingMap的构造函数中得到summingMap,然后将新值4放入summingMap中,此时summingMap中key为"a"的值应为1+3+4=7,而key为"b"的值不变。
阅读全文