Необходимо изменить порядок пар ключ/значение HashMap.

У меня есть набор парных данных ключ/значение в виде 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]).

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

Вот первоначальная настройка. Consumer может так же легко быть 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);

person user1094651    schedule 03.02.2012    source источник
comment
Это вопрос по Java? Какой язык вы используете?   -  person Cratylus    schedule 04.02.2012
comment
Похоже на Яву. Вы не можете получить доступ к отдельным элементам, просто используя ArrayList.get()? docs.oracle.com/javase /6/docs/api/java/util/   -  person EdH    schedule 04.02.2012


Ответы (1)


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

  1. Выделите новый Map<EventMsg, Set<Consumer>> result
  2. Iterate over consumerMsgListMap.entries(), which gives you Map.Entry<Consumer, ArrayList<EventMsg>> objects, one at a time.
    1. Set key = entry.key(), value=entry.value()
    2. For each EventMsg e in value,
      1. if e is not a key in result, then result.put(e, new HashSet<Consumer>());
      2. result.get(e).add(key)
person Ernest Friedman-Hill    schedule 03.02.2012