Java 从地图中找出给定值的键的更快方法?

Java 从地图中找出给定值的键的更快方法?,java,map,Java,Map,我想从HashMap中找出给定值的键,目前我必须检查所有键并在map中检查其值,有没有更快的方法?使用更好的数据结构,如树形图,因为这样搜索效率会更高。没有,没有更快的方法(不引入其他数据结构)。如果您需要经常这样做,请重新考虑您的设计。也许您需要另一个HashMap,其键是另一个HashMap的值?执行此操作的另一个数据结构是来自google collections API的BiMap API文档是。这是最简单的方法 private Object getKey(LinkedHashMap lm

我想从HashMap中找出给定值的键,目前我必须检查所有键并在map中检查其值,有没有更快的方法?

使用更好的数据结构,如树形图,因为这样搜索效率会更高。

没有,没有更快的方法(不引入其他数据结构)。如果您需要经常这样做,请重新考虑您的设计。也许您需要另一个
HashMap
,其键是另一个
HashMap
的值?

执行此操作的另一个数据结构是来自google collections API的
BiMap


API文档是。

这是最简单的方法

private Object getKey(LinkedHashMap lm, int val){

    Object[] j = lm.keySet().toArray();
    return j[val];
}

以下是有关stackoverflow的两篇相关文章:

  • 一些解决方案尚未提及:

    源代码来自:

    如果您查看HashMap.get(key)方法,您将看到

    Entry Entry=getEntry(键)

    为什么getEntry(键)方法是私有的??它返回所需搜索的键和值。我会用蛮力来使用这个方法,但这是一个丑陋的解决方案

    方法在HashMap中的实现如下

    /**
     * Returns the entry associated with the specified key in the
     * HashMap.  Returns null if the HashMap contains no mapping
     * for the key.
     */
    final Entry<K,V> getEntry(Object key) {
        int hash = (key == null) ? 0 : hash(key);
        for (Entry<K,V> e = table[indexFor(hash, table.length)];
             e != null;
             e = e.next) {
            Object k;
            if (e.hash == hash &&
                ((k = e.key) == key || (key != null && key.equals(k))))
                return e;
        }
        return null;
    }
    
    /**
    *返回与中指定键关联的项
    *哈希映射。如果HashMap不包含映射,则返回null
    *找钥匙。
    */
    最终条目getEntry(对象键){
    int hash=(key==null)?0:hash(key);
    for(条目e=表[indexFor(hash,table.length)];
    e!=null;
    e=e.next){
    对象k;
    如果(e.hash==hash&&
    ((k=e.key)==key | |(key!=null&&key.equals(k)))
    返回e;
    }
    返回null;
    }
    
    一个问题是,一个值可以与多个键关联。在这种情况下,您只能获得为该值找到的第一个键。如果一个值最多应该与一个键相关联(如果您想找到反向映射,可能应该是这样),那么您应该使用BiMap(如下所述),它强制执行此操作,并允许您轻松获得值->键映射。
    TreeMap
    如何更有效地搜索?如果要查找给定值的键,您仍然需要遍历所有值。@Jesper-是的,但由于树映射是排序的,因此您必须遍历的节点数通常(并非总是)比HashMap中的节点数少得多a
    treemap
    是按键排序的,而不是按值排序的,因此如果要查找与值匹配的键,按键排序对您没有帮助。您必须查看所有值。OP正在寻找反向查找解决方案,以按值获取键。没有键作为输入。
    /**
     * Returns the entry associated with the specified key in the
     * HashMap.  Returns null if the HashMap contains no mapping
     * for the key.
     */
    final Entry<K,V> getEntry(Object key) {
        int hash = (key == null) ? 0 : hash(key);
        for (Entry<K,V> e = table[indexFor(hash, table.length)];
             e != null;
             e = e.next) {
            Object k;
            if (e.hash == hash &&
                ((k = e.key) == key || (key != null && key.equals(k))))
                return e;
        }
        return null;
    }