2015-12-30 5 views
1

Привета Я переменная Map определена следующим образом:Удаления подмножества значений из HashMap в Java

Map<String,List<Event>> myMap = new HashMap<String,List<Event>>(); 

Lets говорит (ключ: значение) пары (а: (x1, x2, x3)), (pqr: (x2, x4, x5)) и (xyz: (x4, x2, x9)).

Теперь, чтобы удалить, мы будем делать myMap.remove ("pqr"), но это позволит удалить целую пару (ключ: значение). Но я хочу просто удалить x5 в наборе (x2, x4, x5), чтобы он приводил к (pqr: (x2, x4)).

Пожалуйста, помогите мне в достижении этого, предложив несколько эффективных способов сделать это.

+0

Определение MyMap не показывается правильно в этом вопросе, даже после ввода его правильно. Это в основном Map > где Событие можно принять за общий объект. – gautam

+0

Может ли событие быть в нескольких списках? Смысл, мог ли я когда-нибудь найти, скажем, 'x5' в' abc', а также 'pqr'? – Todd

+0

Простите, Тодд, я не понял. В любом случае, здесь все события независимы и не имеют ничего общего с событиями, соответствующими другим клавишам. – gautam

ответ

3

Просто:

myMap.get(pqr).remove(x5); 
0

myMap.put (key, value) будет обновлять ключ, значение спаривания (и возвращать исходное значение), поэтому я бы предложил просто поместить новые значения, которые вы хотите на карте.

+0

спасибо, но я был бы признателен, если бы вы предложили способ удалить событие напрямую, а не менее эффективный способ перезаписи с измененным набором (что может быть очень большим время от времени!). – gautam

1

Учитывая значения быть ArrayList, вы будете иметь, чтобы получить значение ключа «PQR» и удалить данные из ArrayList, как ответил выше.

0

Я не знаю, можете ли вы это сделать (это означает, что ограничения конфигурации), но кажется, что у вас есть какие-то требования MultiMap.

Я бы предложил (если можно) взглянуть на некоторые реализации MultiMap, например Guava. См. Соответствующий here или here

0

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

Что касается эффективности, в связи с тем, что вам нужно для поиска объекта (удалить его), я бы с

Map<String, Set<Event>> myMap = new HashMap<String, Set<Event>>(); 

или Multimap из гуавы.

При заказе не ваше беспокойство, используйте HashSet<Event> O (1) на добавления/удаления

Если требуется естественное упорядочение, используйте TreeSet<Event> O (LogN) на добавления/удаления

Если вставка заказа требуется, используйте LinkedHashSet<Event> O (1) на добавления/удаления

Примечание: Если вы принимаете дубликаты (которые были бы хорошей причиной для выбора List больше Set) myMap.get(pqr).remove(x5); бы только удалить первое вхождение этого объекта , Если вам нужно удалить все вхождения x5, то следующий будет работать:

myMap.get(pqr).removeAll(Collections.singleton(x5)); 
Смежные вопросы