Java确定字符串是否以键映射开始

时间:2015-11-09 22:52:49

标签: java dictionary

我想确定给定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);
        }
    }
}

我的问题是:是否有更好的数据结构来处理这个问题?

2 个答案:

答案 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。

现在,您不仅可以使用其值的子字符串搜索特定键,还可以高效地执行此操作。请注意,这要归功于compareToString的实施。

所以你的问题变得微不足道了:

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;开头的键。