ConcurrentHashMap - добавление элементов с одинаковым ключом - PullRequest
0 голосов
/ 26 ноября 2018

У меня есть CuncurrentHasMap:

private static ConcurrentHashMap<String, Object> testParameters =
new ConcurrentHashMap<String, Object>();

Я нажимаю (иногда) объекты с одинаковыми ключами, эти объекты являются TreeMaps типа TreeMap (string, MyPrivateClass).

Какизменить метод put, чтобы объекты с одинаковым ключом были размещены вместе и не были переопределены?

public static void put(String key, Object object) {

        getTestParameters().put(key, object);
}

Ответы [ 3 ]

0 голосов
/ 26 ноября 2018

Если это приемлемо для вас, вы можете использовать реализацию Guava Multimap.Он может хранить несколько значений для одного ключа.Поскольку, похоже, вам нужна карта, которая является поточно-ориентированной, я бы использовал метод Multimaps.synchronizedMultimap и сделал бы что-то вроде этого:

Multimap<String, Object> multimap = HashMultimap.create();
Multimap synchronizedMultimap = Multimaps.synchronizedMultimap(multimap);
0 голосов
/ 26 ноября 2018

Как вы указали в комментариях, что новые TreeMap введенные значения должны быть объединены с существующими, вы можете переписать свое поле и метод put следующим образом:

private static Map<String, Map<String, MyPrivateClass>> testParameters = new ConcurrentHashMap<>();

public static void put(String key, TreeMap<String, MyPrivateClass> value) {
    Map<String, MyPrivateClass> currentValue = testParameters.get(key);
    if(null == currentValue) {
        // create new sub map
        TreeMap<String, MyPrivateClass> newValue = new TreeMap<>(value);
        testParameters.put(key, Collections.synchronizedMap(newValue));
    } else {
        // merge values' entries into existing sub map.
        currentValue.putAll(value);
    }
}

, который можно записать как:

public static void put(String key, TreeMap<String, MyPrivateClass> value) {
    testParameters.computeIfAbsent(key, k -> (
      Collections.synchronizedMap(
      new TreeMap<>(value.comparator())))).putAll(value);
}

Использование ConcurrentHashMap указывает, что вы собираетесь получать доступ к карте одновременно из нескольких потоков, поэтому я добавил Collections.synchronizedMap().

0 голосов
/ 26 ноября 2018

Задайте значение List<Object> (или некоторый другой тип контейнера / коллекции) вместо Object:

private static ConcurrentHashMap<String, List<Object>> testParameters =
    new ConcurrentHashMap<>();

, а затем используйте compute вместо put для создания и добавления всписок:

getTestParameters().compute(key, (k, v) -> {
  if (v == null) v = new ArrayList<>();
  v.add(object);
  return v;
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...