Как добавить все целые числа для дубликатов элементов в HashMap? - PullRequest
0 голосов
/ 23 мая 2018

У меня есть следующий 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 голосов
/ 23 мая 2018

Для и выше

Возможно, вы просто захотите использовать метод Map#merge.Это самый простой способ.Если ключ не существует, он добавит его, если он существует, он выполнит операцию объединения.

map.merge("car", 100, Integer::sum);
map.merge("car", 20, Integer::sum);

System.out.println(map); // {car=120}
0 голосов
/ 23 мая 2018

HashMap не сохраняет дубликаты ключей!

Вы можете расширить класс HashMap (JAVA> = 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

0 голосов
/ 23 мая 2018

Когда вы добавляете «TV» во второй раз, первое значение (140) будет переопределено, потому что вы не можете иметь дублированные ключи в реализации карты.Если вы хотите увеличить значение, вам нужно проверить, существует ли ключ «TV», а затем увеличить / добавить значение.

Например:

if (map.containsKey(key)) {
   value += map.get(key);
} 
map.put(key, value)
0 голосов
/ 23 мая 2018

Я полагаю, что ваш вопрос таков: как поместить пары ключ / значение в карту таким образом, чтобы вместо того, чтобы заменить его, вместо того, чтобы заменить его, для того же ключа.

В Java есть метод Mapспециально для этой цели:

map.merge(key, value, (v, n) -> v + n);

Это добавит значение, если ключ отсутствует на карте.В противном случае он заменит текущее значение на сумму текущих и новых значений.

Метод merge был представлен в Java 8.

0 голосов
/ 23 мая 2018

Прежде всего, вы не можете добавить дубликаты ключей на карту.Но если я понял, что вы хотите, приведенный ниже код может вам помочь:

    if (map.containsKey(key))
        map.put(key, map.get(key) + newValue);
    else
        map.put(key, newValue);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...