更快地从Map中找出给定值的关键字?

时间:2010-05-14 02:10:17

标签: java map

我想从HashMap中找出给定值的关键,目前我必须通过所有键并在地图中检查它的值,有更快的方法吗?

6 个答案:

答案 0 :(得分:8)

执行此操作的备用数据结构是Google集合API中的BiMap

API文档为here

答案 1 :(得分:6)

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

答案 2 :(得分:2)

这是最简单的方法

private Object getKey(LinkedHashMap lm, int val){

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

答案 3 :(得分:1)

以下是stackoverflow上的两个相关帖子:

  1. Does Java have a HashMap with reverse lookup?
  2. Bi-directional Map in Java?
  3. 尚未提及某些解决方案BidiMap

    源代码来自here

    package com.discursive.jccook.collections.bidi;
    import org.apache.commons.collections.BidiMap;
    import org.apache.commons.collections.bidimap.DualHashBidiMap;
    public class BidiMapExample {
        private BidiMap countryCodes = new DualHashBidiMap( );
        public static void main(String[] args) {
            BidiMapExample example = new BidiMapExample( );
            example.start( );
        }
    
        private void start( ) {
            populateCountryCodes( );
    
            String countryName = (String) countryCodes.get( "tr" );
            System.out.println( "Country Name for code 'tr': " + countryName );
            String countryCode = 
                (String) countryCodes.inverseBidiMap( ).get("Uruguay");
            System.out.println( "Country Code for name 'Uruguay': " + countryCode );
    
            countryCode = (String) countryCodes.getKey("Ukraine");
            System.out.println( "Country Code for name 'Ukraine': " + countryCode );
        }
    
        private void populateCountryCodes( ) {
            countryCodes.put("to","Tonga");
            countryCodes.put("tr","Turkey");
            countryCodes.put("tv","Tuvalu");
            countryCodes.put("tz","Tanzania");
            countryCodes.put("ua","Ukraine");
            countryCodes.put("ug","Uganda");
            countryCodes.put("uk","United Kingdom");
            countryCodes.put("um","USA Minor Outlying Islands");
            countryCodes.put("us","United States");
            countryCodes.put("uy","Uruguay");
        }
    }
    

答案 4 :(得分:-1)

如果你看一下HashMap.get(key)方法,你会看到

的使用

输入条目= 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;
}

答案 5 :(得分:-2)

使用更好的数据结构,如TreeMap,因为搜索效率会更高。