如何在HashMap中为重复元素添加所有整数?

时间:2018-05-23 09:09:47

标签: java hashmap

我有以下HashMap:

Map<String, Integer> map = new HashMap<>();

如何总结重复字符串的所有整数?或者有没有更好的方法来使用Set?

例如,如果我添加这些元素:

car 100

TV 140

car 5

charger 10

TV 10

我希望列表包含:

car 105

TV 150

charger 10

5 个答案:

答案 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)

及更高

您可能只想使用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