带集合的 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 = 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,恢复它的所有值对我来说会更好吗?
我正在处理 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 = 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,恢复它的所有值对我来说会更好吗?