在Mysql中,我们可以查询具有子句"的表。 WHERE name LIKE'%someName%' ",我们可以在java中使用与HashMap相同的功能,如果是这样的话,我们怎样才能在更短的时间内更有效地实现这一目标通过不迭代对每个元素?
答案 0 :(得分:5)
如果你正在使用Java SE 8和新的Streams API:我认为有一个filter方法基本上就是你想要的方法。
e.g。像(未经测试的!):
myMap.entrySet().stream().filter(entry -> entry.getKey().contains("someName")).map(entry -> entry.getValue()).collect(Collectors.toList());
答案 1 :(得分:3)
您可以迭代所有密钥并检查它们是否与正则表达式匹配。这可能不是最有效的方式,但这是我想到的第一件事。 这是它的样子:
Pattern p = Pattern.compile("*someName*"); // the regexp you want to match
List<String> matchingKeys = new ArrayList<>();
for (String key : map.keySet()) {
if(p.matcher(key).matches()) {
matchingKeys.add(key);
}
}
// matchingKeys now contains the keys that match the regexp
注意:map
应该像这样声明:
HashMap<String, SomeValueClass> map = new HashMap<>();
答案 2 :(得分:1)
可能有一种方法可以在Java中实现此功能,但HashMap
不会这样做。
答案 3 :(得分:0)
如果要获取地图中与给定键关联的所有值,则执行反向查找。
您需要遍历地图中的每个键/值对,搜索给定值并将其存储到集合中。像这样:
List<KeyType> keys = new ArrayList<>();
for (Map.Entry<KeyType, ValueType> e : myMap)
if(e.getValue().equals(valueWeAreSearchingFor)) keys.add(e.getKey());
答案 4 :(得分:0)
删除所有不包含关键部分的值:
yourMap.keySet().removeIf(key -> !key.contains(keyPart));
或正则表达式:
yourMap.keySet().removeIf(key -> !key.matches(".*keyPart.*"));