我想确定给定String
startsWith
Map
中是否有任何键。
简单的解决方案是遍历整个keySet
。
private static Map<String, String> someMap;
private static void method(String line) {
for (String key : someMap.keySet()) {
if (line.startsWith(key)) {
// do something with someMap.get(key);
}
}
}
我的问题是:是否有更好的数据结构来处理这个问题?
答案 0 :(得分:6)
这不能直接用HashMap
完成:问题是HashMap
使用在密钥上计算的哈希来管理其在集合中的位置。因此,无法搜索以特定子字符串开头的String
键,因为两个相似的String
值及其哈希值之间没有相关性。
但是没有任何东西丢失,如果你切换到TreeMap<String,String>
问题可以轻松解决。 TreeMap
仍然是关联容器,但它按排序顺序使用红黑树存储条目。
这意味着TreeMap
内的元素始终排序。除此之外,它还为您提供了一些功能:
Map.Entry<K,V> ceilingEntry(K key)
:返回与最大键大于或等于给定键关联的键值映射,如果没有这样的键,则返回null。
Map.Entry<K,V> floorEntry(K key)
:返回与最大键小于或等于给定键关联的键值映射,如果没有这样的键,则返回null。
现在,您不仅可以使用其值的子字符串搜索特定键,还可以高效地执行此操作。请注意,这要归功于compareTo
类String
的实施。
所以你的问题变得微不足道了:
TreeMap<String, Object> map = new TreeMap<String, Object>();
map.put("baz", new Object());
map.put("foo", new Object());
map.put("fooz", new Object());
map.put("fo", new Object());
Map.Entry<String, Object> test = map.ceilingEntry("fo");
bool containsSubStringKey = test != null && test.getKey().startsWith("fo");
答案 1 :(得分:0)
TreeMap<String, Object> map = new TreeMap<String, Object>();
map.put("baz", new Object());
map.put("foo", new Object());
map.put("fooz", new Object());
map.put("foor", new Object());
NavigableMap tempMap = list.subMap("foo", true, "fop", false);
//这将返回以&#34; foo&#34;开头的键的映射。 true表示包含和// false独占。 &#34; FOP&#34;是第一个不以&#34; foo&#34;开头的键。