Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 获取键的列表';HashMap中具有类似于';一些值';_Java_Hashmap - Fatal编程技术网

Java 获取键的列表';HashMap中具有类似于';一些值';

Java 获取键的列表';HashMap中具有类似于';一些值';,java,hashmap,Java,Hashmap,在Mysql中,我们可以查询具有子句“WHERE name LIKE'%someName%'””的表,我们是否可以在java中使用HashMap具有相同的功能,如果是这样,我们如何通过不在每个元素上迭代来在更短的时间内更有效地实现这一点 在Java中可能有一种方法可以实现此功能,但是HashMap无法实现此功能。如果要获取映射中与给定键关联的所有值,则需要执行反向查找 您需要迭代映射中的每个键/值对,搜索给定的值并将其存储到集合中。大概是这样的: List<KeyType> keys

在Mysql中,我们可以查询具有子句“WHERE name LIKE'%someName%'””的表,我们是否可以在java中使用HashMap具有相同的功能,如果是这样,我们如何通过不在每个元素上迭代来在更短的时间内更有效地实现这一点

在Java中可能有一种方法可以实现此功能,但是
HashMap
无法实现此功能。

如果要获取映射中与给定键关联的所有值,则需要执行反向查找

您需要迭代映射中的每个键/值对,搜索给定的值并将其存储到集合中。大概是这样的:

List<KeyType> keys = new ArrayList<>();
for (Map.Entry<KeyType, ValueType> e : myMap)
    if(e.getValue().equals(valueWeAreSearchingFor)) keys.add(e.getKey());
HashMap<String, SomeValueClass> map = new HashMap<>();
List key=new ArrayList();
对于(Map.Entry e:myMap)
如果(e.getValue().equals(valueWeAreSearchingFor))keys.add(e.getKey());

您可以迭代所有键,并检查它们是否与regexp匹配。这可能不是最有效的方法,但这是我想到的第一件事。 下面是它的样子:

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

如果您使用的是JavaSE8和新的StreamsAPI:我认为有一种方法基本上就是您所寻找的

e、 g.类似于(未经测试!):


删除不包含关键部分的所有值:

yourMap.keySet().removeIf(key -> !key.contains(keyPart));
或正则表达式:

yourMap.keySet().removeIf(key -> !key.matches(".*keyPart.*"));

只需使用一些正则表达式循环,或者创建您自己的映射。映射中的键或值是“name”吗?是否返回键或值的列表?“名称”是地图中的键。您希望它的效率如何?您可以对HashMap进行暴力搜索,也可以高效地使用NavigableMap,但代码要复杂得多。i、 e.如果暴力搜索对您来说不明显,不要尝试使用NavigableMap。我需要更频繁地在大量密钥中搜索密钥。我也希望找到实现这一点的方法,您能展示一些代码示例吗?在搜索频繁具有1000个密钥的地图时会发生什么?这可能无法满足OP的需要,因为他想匹配一个模式,而不是一个精确的值。@achuth好吧,你必须在整个地图上迭代,所以速度会很慢。考虑使用像jjfrtrue一样的东西,我没有得到这个问题的一部分。您的答案更好,upvoting。这将满足我的功能需求,但我考虑的是一组大的键值,它们必须进行大量的迭代times@achuth那为什么不使用真正的数据库呢?如果键的数量如此之大,您的程序将需要多少内存?实际上,我从数据库的表中的一列中获取所有键,大小为62Kb@achuth那么,在获取信息时,为什么不使用
LIKE
SQL关键字呢?我认为这比在内存中加载所有内容并在一行中多次迭代更有效。所有密钥都以JSON格式存储在一行中的单个coumnThank you@Puce!我只需要关键部分,所以
myMap.entrySet().stream().filter(entry->entry.getKey().contains(“someName”)).collect(Collectors.toList())足够了
yourMap.keySet().removeIf(key -> !key.matches(".*keyPart.*"));