具有集合<string>

时间:2018-12-14 12:29:51

标签: java hashmap multimap

我正在处理XML文件。在我的XML文件中,有一些带有子节点的节点。该XML文件具有多个标签。

<Cat categorie="CAT 1" guid="e9fdsd8ff">
    <!--Electric energie management-->
    **<item Var="VAR1" guid="2795ddsd410d">
        <desc> Energie Smart Management 
        </desc>
        <App guid="240adsqsd" />
        <App guid="90dqddqsq" />**
    </item>
</Cat>

就像您看到的那样,我的节点“ item”具有参数VAR = var1并具有2个孩子。 因此,我创建了一个hashMap来放置1个节点,如下所示,他的孩子

private Map<String, Collection <String >> multiMap = new HashMap <> ();

所以我实际上有类似的东西:[Key=Var1, Value = [gui0,guid1,...]]

现在,我想知道您是否知道如何验证与键相关联的集合中是否包含GUID,以便检索该键。

例如,如果我有这个String:240adsqsd。我想恢复Var1

感谢您的帮助

4 个答案:

答案 0 :(得分:1)

有可能。 假设您有密钥myKey,并且想知道字符串mySearchString是否包含在该密钥后面的集合中。

multiMap.get("myKey").contains("mySearchString");

如果true equals(区分大小写)中的任何对象,它将返回mySearchString

不过,您必须要小心,集合上的方法contains使用区分大小写的equals方法,并且仅在100%相等时才有效。因此,当您的收藏夹中包含"MYSEARCHstring"之类的内容时,它就不会像"The sentence that contains mySearchString"一样有效。

编辑:
(感谢尼古拉斯和迪奇)
这里是一个更完整的示例,说明如何实现这一点。

String mySearchString = "mySearchString";
Map<String, Collection<String>> multiMap = new HashMap<>();
for (String key : multiMap.keySet()) {
    if (multiMap.get(key) != null && multiMap.get(key).contains(mySearchString)) {
        return key;
    }
}

如果您不知道键,则必须遍历地图,检查集合之一是否包含搜索到的字符串,然后在找到集合(及其键)时返回键。

答案 1 :(得分:0)

未经地图修改的测试将是:

boolean contained = multiMap.getOrDefault(key, Collections.emptyList()).contains(key);

如果要更新地图,则有Map.computeIfAbsent, computeIfPresent, merge

答案 2 :(得分:0)

如果我理解您的问题,那么您实际上想反转地图,因为地图擅长访问给定键的值而不是查找给定键的值。这是一些构建地图的伪代码:

map = new Map()
for item in items
    for app in item.apps
        map.put(app.guid, item.guid) // assuming guids are always unique

这将为您提供Map<String, String>而不是Map<String, Collection<String>>。前者擅长告诉您哪个项目包含一个应用程序,后者擅长告诉您给定项目包含哪些应用程序。给定您的反向映射图,您将能够执行以下操作:

// could just have Map<App, Item> appToItem if you build your map differently 
// and App and Item define hashCode and equals
public boolean findVar(String appId, Map<String, String> appToItem, Map<String, Item> itemsById) {
    Item item = itemsById.get(appToItem.get(appId));
    if (item == null) return null;
    return item.getVar();
}

答案 3 :(得分:0)

谢谢大家的回答。

如果我理解正确,最好是寻找一个值而不是他的钥匙。

所以我们承认我选择了此选项。

我可以重试一个键的每个值吗?

例如,如果我的密钥是Var1,对我来说恢复它的所有值会更好吗?