带集合的 MultiMap<String>

MultiMap with Collection<String>

我正在处理 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 是否包含在与密钥关联的集合中以便检索此密钥。

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

感谢您的帮助

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

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

如果 mySearchString equals(区分大小写)集合中的任何 object,它将 return true

不过您必须小心,collection 上的方法 contains 使用区分大小写的 equals 方法,并且仅在它们 100% 相等时才有效。因此,当您的 collection 包含 "MYSEARCHstring" 之类的内容时,它将无法正常工作,以及 "The sentence that contains mySearchString".

编辑:
(感谢 Nikolas 和 Dici)
这里有一个更完整的示例如何实现这一点。

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;
    }
}

如果您不知道密钥,则必须遍历地图,检查 collection 之一是否包含搜索的字符串,然后,当您找到 collection (及其密钥)return 密钥。

没有地图修改的测试将是:

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

然后有Map.computeIfAbsent, computeIfPresent, merge想更新地图

如果我理解你的问题,你实际上想要反转你的地图,因为地图擅长访问给定键的值而不是找到给定值的键。下面是一些构建地图的伪代码:

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();
}

感谢大家的回答。

如果我没理解错的话,我最好找一个值而不是他的键。

所以让我们承认我选择了这个选项。

我可以恢复一个键的每个值吗?

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