Сохранить все значения Дубликат ключа на карте - PullRequest
3 голосов
/ 04 апреля 2019
Map<String,Integer> map=new HashMap<String,Integer>();
map.put("A",1);
map.put("A",2);
map.put("A",3);
map.put("B",4);

Здесь Мой ключ A, и он переопределит предыдущее значение A и даст значение ключа A, равное 3. Но я хочу сохранить все значения этого ключа, как я хочу сохранить 1, 2 и 3.Тогда, пожалуйста, скажите мне, как все эти значения конкретного ключа хранятся в массиве.

Ответы [ 5 ]

1 голос
/ 04 апреля 2019

Это не работает таким образом.Ключи карты уникальны по определению.Вам понадобится Map<String, List<Integer>> Конечно, прежде чем добавить ключ, вам нужно найти, если запись уже существует.Если нет, добавьте новый Arraylist, используя ключ, и добавьте значение в новый список.

0 голосов
/ 05 апреля 2019

В соответствии с вашими требованиями вам не нужно Map<String, Integer>, а Map<String, List<Integer>>. Другими словами, вы после мультикарты .

Одним из способов достижения такой структуры данных в Java 8+ является использование Map.computeIfAbsent и Map.computeIfPresent методов для вставки и удаления соответственно:

Map<String, List<Integer>> map = new HashMap<>(); // use diamond operator

// INSERT
map.computeIfAbsent("A", k -> new ArrayList<>()).add(1);
map.computeIfAbsent("A", k -> new ArrayList<>()).add(2);
map.computeIfAbsent("A", k -> new ArrayList<>()).add(3);
map.computeIfAbsent("B", k -> new ArrayList<>()).add(4);

// REMOVE
map.computeIfPresent("A", (k, v) -> {
    v.remove(1);
    return v.isEmpty() ? null : v;
});
map.computeIfPresent("A", (k, v) -> {
    v.remove(2);
    return v.isEmpty() ? null : v;
});
map.computeIfPresent("A", (k, v) -> {
    v.remove(3);
    return v.isEmpty() ? null : v;
});
map.computeIfPresent("B", (k, v) -> {
    v.remove(4);
    return v.isEmpty() ? null : v;
});

EDIT:

Аргумент функции переназначения для удалений может быть извлечен следующим служебным методом:

static <K, V> BiFunction<K, List<V>> removing(V elem) {
    return (k, v) -> { v.remove(elem); return v.isEmpty() ? null : v; };
}

Что может быть использовано следующим образом:

map.computeIfPresent("A", removing(1));
map.computeIfPresent("A", removing(2));
map.computeIfPresent("A", removing(3));
map.computeIfPresent("B", removing(4));
0 голосов
/ 04 апреля 2019

Попробуйте и надеюсь, что это поможет.

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class MapwithDupKeys {

    public static void main(String[] args) {

        Map<String, List<Integer>> myMultiMap = new HashMap<>();
        add(myMultiMap, "A", 1);
        add(myMultiMap, "A", 2);
        add(myMultiMap, "A", 3);
        add(myMultiMap, "B", 4);
        System.out.println(myMultiMap);
    }

    static void add(Map<String, List<Integer>> map, String key, Integer value) {
        if (map.get(key) == null) {
            List valueList = new ArrayList();
            valueList.add(value);
            map.put(key, valueList);
        } else
            ((ArrayList) map.get(key)).add(value);
    }

}

enter image description here

0 голосов
/ 04 апреля 2019

Давайте проанализируем требование

  1. У вас есть ключ типа String, который необходим для сопоставления с коллекцией (уникальных) значений типа Integer. (уникально мое предположение). Я имею в виду («xyz», 1) и («xyz, 1) в случае этих двух записей на карте, это должно рассматриваться как только одна запись.
  2. С точки 1 мы можем определить структуру для записи: [Key-String, Value-Set]
  3. Карта необходима для хранения записей типа, упомянутого в пункте 2.

У нас может быть карта, как показано ниже.

HashMap <String, Set<Integer>> 

Позволяет перевести его на простейшую реализацию, хотя возможны и другие варианты.

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

  public void putPair( String key, Integer value){
          Set<Integer> values = map.get(key);
          if(values == null){
               values = new HashSet<Integer>();
                map.put(key, values);
          }
          values.add(value);
   }

Если вы хотите использовать несколько одинаковых значений, вы можете использовать простой ArrayList вместо Set. Но в этом случае лучшим способом является инкапсуляция Integer в другой класс-оболочку и ведение счета. увеличить счет в случае той же записи.

0 голосов
/ 04 апреля 2019

Или более зрелой альтернативой может быть multiMap Гуавы.

Вы можете найти ссылку на его использование здесь

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...