我有一组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);
答案 0 :(得分:0)
对我而言,这似乎相当简单。用于双嵌套循环的伪代码:
Map<EventMsg, Set<Consumer>> result
consumerMsgListMap.entries()
,一次一个地为您提供Map.Entry<Consumer, ArrayList<EventMsg>>
个对象。
key
= entry.key()
,value=entry.value()
EventMsg e
中的每个value
,
e
不是result
中的关键,那么result.put(e, new HashSet<Consumer>());
result.get(e).add(key)