需要重新排列HashMap键/值对

时间:2012-02-03 20:20:33

标签: hashmap hashset key-value

我有一组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条目都有一个关联的Consumer。例如:

  

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可以很容易地成为整数:

  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 :(得分:0)

对我而言,这似乎相当简单。用于双嵌套循环的伪代码:

  1. 分配新的Map<EventMsg, Set<Consumer>> result
  2. 遍历consumerMsgListMap.entries(),一次一个地为您提供Map.Entry<Consumer, ArrayList<EventMsg>>个对象。
    1. 设置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)