我不确定我在这里做错了什么。我有一个字符串(userIdList)
的列表,如下所示 -
[event.1386979194020.24551521.DC1, modela.1386979194020.24551521.DC1]
以上格式如下 -
A.B.C.D
此处,C是user-id
,A是attribute name
。因此,在上面的示例中,对于上面列表中的第一个字符串 - 24551521
是user-id
,event
是属性名称。类似地,对于上面列表中的第二个字符串,modela
是属性名称,24551521
是用户ID。
正如您所看到的,24551521
user-id有两个属性event
和modela
。
所以我试图迭代userIdList
并创建一个地图,使得地图中的键具有24551521
作为用户ID,地图中的值将是一组字符串并且它应为event
和modela
,
但不知何故,在我的下面的代码中,我总是看到 - 24551521
作为地图的关键,modela
在字符串值集合中event
和modela
在集合中。
下面是我试图迭代userIdList
-
Map<String, Set<String>> userAttribute = new LinkedHashMap<String, Set<String>>();
for(String ss : userIdList) {
Set<String> attributeTypes = new LinkedHashSet<String>();
attributeTypes.add(ss.split("\\.")[0]);
// this always override my previous set value
userAttribute.put(ss.split("\\.")[2], attributeTypes);
}
如果我打印出userAttribute
地图,我始终会将24551521
视为关键,modela
作为设定值,而不是我想要的。但它应该是24551521
和一组字符串 - event
和modela
有什么想法,我在这里做错了什么?
答案 0 :(得分:2)
在每次迭代中,您都要定义新的Set,然后将其写入Map(覆盖旧的Set)。 你应该检查这个id是否有Set并更新它
Set<String> attributeTypes;
String id = ss.split("\\.")[2];
if(userAttribute.containsKey(id))
attributeTypes = userAttribute.get(id);
else
attributeTypes = new LinkedHashSet<String>();
attributeTypes.add(ss.split("\\.")[0]);
userAttribute.put(id, attributeTypes);
答案 1 :(得分:1)
只为键创建一个,通过检查它是否在那里,如果不存在,创建一个新的并将其放在地图中:
Map<String, Set<String>> userAttribute = new LinkedHashMap<String, Set<String>>();
for (String ss : userIdList) {
String id = ss.split("\\.")[2];
Set<String> attributeTypes = userAttribute.get(id);
if (attributeTypes == null) { // null is returned if there's no entry
attributeTypes = new LinkedHashSet<String>();
userAttribute.put(id, attributeTypes);
}
attributeTypes.add(ss.split("\\.")[0]);
}
注意如何只调用map.put()
(如果遇到新的id
)。此外,只有一次拨打map.get()
而没有拨打map.contains()
- 这是最有效的方法。