2012-02-03 88 views
1

我有一组需要处理的HashMap形式的键/值配对数据。需要重新排列HashMap键/值对

这里是对象的我期待在签名:

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

的System.out.println(consumerMsgListMap.toString())的结果如下:

ConsumerA = [MSG1,第三型信息的],ConsumerB = [MSG1,MSG2,MSG4],ConsumerC = [MSG2,第三型信息的]

正如你可以看到每个值()是一个列表,而不是一个单独的值。

我需要找出一种重新排列数据的方法,以便每个唯一的 EventMsg条目都有一个关联的消费者。例如:

MSG1需要与[ConsumerA,ConsumerB]

MSG2需要与[ConsumerB,ConsumerC]

Msg3的需要与相关联的相关联的相关联ConsumerA,ConsumerC]

MSG4需要与[ConsumerB]

关联这不是简单地颠倒的K,V的事对。

我认为正确的做法是通过建立一个独立的HashSet拿到唯一的所有值中,但我想不通的值作为单个实体

(如MSG1,消息3得到的一种方式,MSG1,MSG2,MSG4)

而非实体

的基团(例如[MSG1,第三型信息的],[MSG1,MSG2,MSG4])。

这对经验丰富的专业人员来说可能是显而易见的,但在我的发展阶段,我很难过。希望我已经清楚地说明了这个问题。如果有人有任何想法,请提前致谢。

这是初始设置。消费者可以很容易地将字符串和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); 
+0

这是一个java问题?你在使用哪种语言? – Cratylus 2012-02-03 20:28:45

+0

它看起来像Java。你不能只使用ArrayList.get()来访问单个元素? http://docs.oracle.com/javase/6/docs/api/java/util/ArrayList.html#get(int) – EdH 2012-02-03 20:32:28

+0

是的 - 对不起,这是Java。 – user1094651 2012-02-03 22:16:08

回答

0

这对我来说似乎相当直接。对于adoubly嵌套循环伪代码:

  1. 分配一个新的Map<EventMsg, Set<Consumer>> result
  2. 遍历consumerMsgListMap.entries(),它给你Map.Entry<Consumer, ArrayList<EventMsg>>对象,一次一个。
    1. key = entry.key()value=entry.value()
    2. 对于每个EventMsg evalue
      1. 如果e不在result一个键,然后result.put(e, new HashSet<Consumer>());
      2. result.get(e).add(key)