我有以下HashMap:
Map<String, Integer> map = new HashMap<>();
如何总结重复字符串的所有整数?或者有没有更好的方法来使用Set?
例如,如果我添加这些元素:
car 100
TV 140
car 5
charger 10
TV 10
我希望列表包含:
car 105
TV 150
charger 10
答案 0 :(得分:3)
我相信你的问题是:如何将键/值对以一种改变值的方式放入地图中,而不是将其替换为相同的键。
Java专门用于此目的的Map
方法:
map.merge(key, value, (v, n) -> v + n);
如果地图中的键不是,则会添加该值。否则,它会用当前值和新值的总和替换当前值。
{8}中引入了merge
方法。
答案 1 :(得分:1)
首先,您无法在地图中添加重复键。 但如果我理解你想要的东西,下面的代码可以帮助你:
if (map.containsKey(key))
map.put(key, map.get(key) + newValue);
else
map.put(key, newValue);
答案 2 :(得分:1)
java-8及更高
您可能只想使用Map#merge
方法。这是最简单的方法。如果该密钥不存在,它将添加它,如果它存在,它将执行合并操作。
class OrderDeleteSerializer(ModelSerializer):
class Meta:
model = Order
fields = '__all__'
答案 3 :(得分:0)
当您第二次添加“TV”时,第一个值(140)将被覆盖,因为您无法在Map实现上拥有重复的键。如果你想增加值,你需要检查键“TV”是否已经存在,然后增加/添加值。
例如:
if (map.containsKey(key)) {
value += map.get(key);
}
map.put(key, value)
答案 4 :(得分:-1)
HashMap选择不保存重复密钥!
您可以扩展HashMap类(JAVA&gt; = 8):
public class MyHashMap2 extends HashMap<String, Integer>{
@Override
public Integer put(String key, Integer value) {
return merge(key, value, (v, n) -> v + n);
}
public static void main (String[] args) throws java.lang.Exception
{
MyHashMap2 list3=new MyHashMap2();
list3.put("TV", 10);
list3.put("TV", 20);
System.out.println(list3);
}
}
或者您可以汇总HashMap
并替换put方法以将新值添加到上一个值。
HashMap<String, Integer> list = new HashMap<>();
list.put("TV", 10);
list.put("TV", 20);
System.out.println(list);
MyHashMap list2 = new MyHashMap();
list2.put("TV", 10);
list2.put("TV", 20);
System.out.println(list2);
//OUTPUT:
//{TV=20}
//MyHashMap [List={TV=30}]
public class MyHashMap implements Map<String, Integer>{
HashMap<String, Integer> list = new HashMap<>();
public MyHashMap() {
super();
}
@Override
public int size() {
return list.size();
}
@Override
public boolean isEmpty() {
return list.isEmpty();
}
@Override
public boolean containsKey(Object key) {
return list.containsKey(key);
}
@Override
public boolean containsValue(Object value) {
return list.containsValue( value);
}
@Override
public Integer get(Object key) {
return list.get(key);
}
@Override
public Integer put(String key, Integer value) {
if(list.containsKey(key))
list.put(key, list.get(key)+value);
else
list.put(key, value);
return value;
}
@Override
public Integer remove(Object key) {
return list.remove(key);
}
@Override
public void putAll(Map<? extends String, ? extends Integer> m) {
list.putAll(m);
}
@Override
public void clear() {
list.clear();
}
@Override
public Set<String> keySet() {
return list.keySet();
}
@Override
public Collection<Integer> values() {
return list.values();
}
@Override
public Set<java.util.Map.Entry<String, Integer>> entrySet() {
return list.entrySet();
}
@Override
public String toString() {
return "MyHashMap [list=" + list + "]";
}
}
您可以在此处尝试代码:https://ideone.com/Wl4Arb