如何在一个点上拆分字符串,使每个用户都有一组属性?

时间:2013-12-14 00:24:44

标签: java string list map set

我不确定我在这里做错了什么。我有一个字符串(userIdList)的列表,如下所示 -

[event.1386979194020.24551521.DC1, modela.1386979194020.24551521.DC1]

以上格式如下 -

A.B.C.D

此处,C是user-id,A是attribute name。因此,在上面的示例中,对于上面列表中的第一个字符串 - 24551521user-idevent是属性名称。类似地,对于上面列表中的第二个字符串,modela是属性名称,24551521是用户ID。

正如您所看到的,24551521 user-id有两个属性eventmodela

所以我试图迭代userIdList并创建一个地图,使得地图中的键具有24551521作为用户ID,地图中的值将是一组字符串并且它应为eventmodela

但不知何故,在我的下面的代码中,我总是看到 - 24551521作为地图的关键,modela在字符串值集合中eventmodela在集合中。

下面是我试图迭代userIdList -

的Java代码
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和一组字符串 - eventmodela

有什么想法,我在这里做错了什么?

2 个答案:

答案 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() - 这是最有效的方法。