Java 如何检查映射中的键是否以给定的字符串值开头
我正在寻找一种方法,如:Java 如何检查映射中的键是否以给定的字符串值开头,java,string,map,Java,String,Map,我正在寻找一种方法,如: myMap.containsKeyStartingWith("abc"); // returns true if there's a key starting with "abc" e.g. "abcd" 或 我想知道是否有人知道这样做的简单方法 感谢您,您可以从地图中获得一组键,如果它们是字符串,您可以在该集合的元素上迭代,并检查是否有startsWith(“abc”)这可以通过标准: Map tailMap=myMap.tailMap(前缀); 布尔结果=(!ta
myMap.containsKeyStartingWith("abc"); // returns true if there's a key starting with "abc" e.g. "abcd"
或
我想知道是否有人知道这样做的简单方法
感谢您,您可以从地图中获得一组键,如果它们是字符串,您可以在该集合的元素上迭代,并检查是否有
startsWith(“abc”)
这可以通过标准:
Map tailMap=myMap.tailMap(前缀);
布尔结果=(!tailMap.isEmpty()&&tailMap.firstKey().startsWith(前缀));
未排序的映射(例如,
HashMap
)本质上不支持前缀查找,因此对于那些映射,您必须迭代所有键。要在Adel Boutros关于迭代键效率的回答/评论的基础上,您可以将键迭代封装在映射
子类或装饰器中
扩展
HashMap
将为您提供一个类来放入方法,并将特定于映射的代码保留在方法之外,从而降低复杂性并使代码更自然易读。谢谢,尽管我希望不必反复使用该键,但我可以看出这是可行的set@Edd为什么不呢?java开发人员对此进行了优化,以便以这种方式使用;)它会导致更高的圈复杂度,除非你把它拉到一个单独的方法中,我没有明显的类来放置这样一个方法,所以我希望我不需要为地图创建一个新的实用程序类,其中只有一个方法。。。当我这么说的时候,听起来好像我很懒,但是如果有一个现成的实用方法来解决这个问题的话,它会有所帮助。。。一厢情愿;)在映射键上迭代效率较低:是O(N)。排序映射可以做得更好:O(log N)。@martiell但他没有指定他使用的映射类型,因为我使用的是hashmap我收集的我可以通过以下方式创建树映射:TreeMap TreeMap=new TreeMap();树映射putAll(hashMap)
@Edd:或者更简单的是,TreeMap TreeMap=newtreemap(hashMap)代码>这意味着我的HashMap需要是扩展HashMap的一个实例,并且我必须从Map执行强制转换(如果Map被声明为Map)才能使用该方法。它确实把代码放在了一个整洁的地方,但可能不会那么有用。或者你可以做MyMapExtension m=新建MyMapExtension(myMap)代码>或者您可以使用装饰器解决方案来包装地图。这两本书读起来都和你原来的想法相似。我明白了。。。我认为decorator选项将阻止创建映射的新实例,因此应该更有效
MapUtils.containsKeyStartingWith(myMap, "abc"); // same
Map<String,V> tailMap = myMap.tailMap(prefix);
boolean result = (!tailMap.isEmpty() && tailMap.firstKey().startsWith(prefix));