我正在处理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
。
感谢您的帮助
答案 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,对我来说恢复它的所有值会更好吗?