Нужно переставить пары ключ / значение HashMap - PullRequest
1 голос
/ 04 февраля 2012

У меня есть набор парных данных ключ / значение в форме HashMap, которыми я должен манипулировать.

Вот подпись объекта, на который я смотрю:

    Map<Consumer, ArrayList<EventMsg>> consumerMsgListMap = 
                                       new HashMap<Consumer, ArrayList<EventMsg>>();

Результат System.out.println (consumerMsgListMap.toString ()) следующий:

ConsumerA = [msg1, msg3], ConsumerB = [msg1, msg2, msg4], ConsumerC= [msg2, msg3]

Как видите, каждое значение () является списком, а не отдельным значением.

Мне нужно найти способ переупорядочить данные, напримерчто для каждой уникальной EventMsg записи существует связанный потребитель.Например:

msg1 должен быть связан с [ConsumerA, ConsumerB]

msg2 должен быть связан с [ConsumerB, ConsumerC]

msg3 должен бытьсвязанный с [ConsumerA, ConsumerC]

msg4 должен быть связан с [ConsumerB]

Это не вопрос простого обращения пар K, V.

Я думаю, что правильный подход заключается в том, чтобы получить уникальность среди всех значений путем создания отдельного HashSet, но я не могу найти способ получить значения как отдельные объекты

(например, msg1, msg3, msg1, msg2, msg4)

, а не как группы объектов

(например, [msg1, msg3], [msg1, msg2, msg4]).

Это, вероятно, очевидно для опытного профессионала, но на моей стадии развития я в тупике.Надеюсь, я четко сформулировал проблему.Заранее спасибо, если у кого-нибудь есть идеи.

Вот начальная настройка.Потребителем также может быть String, а EventMsg также может быть Integer:

  Map<Consumer, ArrayList<EventMsg>> consumerMsgListMap = new HashMap<Consumer, ArrayList<EventMsg>>();

  Consumer c1 = new Consumer("ConsumerA");
  Consumer c2 = new Consumer("ConsumerB");
  Consumer c3 = new Consumer("ConsumerC");

  ArrayList<EventMsg> msgListA = new ArrayList<EventMsg>();
  msgListA.add(new EventMsg("msg1"));
  msgListA.add(new EventMsg("msg3"));

  ArrayList<EventMsg> msgListB = new ArrayList<EventMsg>();
  msgListB.add(new EventMsg("msg1"));
  msgListB.add(new EventMsg("msg2"));
  msgListB.add(new EventMsg("msg4"));

  ArrayList<EventMsg> msgListC = new ArrayList<EventMsg>();
  msgListC.add(new EventMsg("msg2"));
  msgListC.add(new EventMsg("msg3"));

  consumerMsgListMap.put(c1, msgListA);
  consumerMsgListMap.put(c2, msgListB);
  consumerMsgListMap.put(c3, msgListC);

1 Ответ

0 голосов
/ 04 февраля 2012

Это кажется довольно простым для меня. Псевдокод для заведомо вложенного цикла:

  1. Выделите новый Map<EventMsg, Set<Consumer>> result
  2. Итерация по consumerMsgListMap.entries(), которая дает вам Map.Entry<Consumer, ArrayList<EventMsg>> объектов, по одному за раз.
    1. Set key = entry.key(), value=entry.value()
    2. Для каждого EventMsg e в value,
      1. если e не является ключом в result, то result.put(e, new HashSet<Consumer>());
      2. result.get(e).add(key)
...