Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java Hashmap: How to get key from value?

Tags:

java

hashmap

If I have the value "foo", and a HashMap<String> ftw for which ftw.containsValue("foo") returns true, how can I get the corresponding key? Do I have to loop through the hashmap? What is the best way to do that?

like image 868
Nick Heiner Avatar asked Sep 05 '09 17:09

Nick Heiner


People also ask

Can we get key from value in HashMap?

If your hashmap contain unique key to unique value mapping, you can maintain one more hashmap that contain mapping from Value to Key. In that case you can use second hashmap to get key.

How do you get key from HashMap in Java?

Use keySet() to Get a Set of Keys From a HashMap in Java The simplest way to get the keys from a HashMap in Java is to invoke the keySet() method on your HashMap object. It returns a set containing all the keys from the HashMap .

How do I find a specific key in a HashMap?

HashMap containsKey() Method in Java HashMap. containsKey() method is used to check whether a particular key is being mapped into the HashMap or not. It takes the key element as a parameter and returns True if that element is mapped in the map.

How do I get the value of a map for a specific key?

HashMap get() Method in Java get() method of HashMap class is used to retrieve or fetch the value mapped by a particular key mentioned in the parameter. It returns NULL when the map contains no such mapping for the key.


2 Answers

If your data structure has many-to-one mapping between keys and values you should iterate over entries and pick all suitable keys:

public static <T, E> Set<T> getKeysByValue(Map<T, E> map, E value) {     Set<T> keys = new HashSet<T>();     for (Entry<T, E> entry : map.entrySet()) {         if (Objects.equals(value, entry.getValue())) {             keys.add(entry.getKey());         }     }     return keys; } 

In case of one-to-one relationship, you can return the first matched key:

public static <T, E> T getKeyByValue(Map<T, E> map, E value) {     for (Entry<T, E> entry : map.entrySet()) {         if (Objects.equals(value, entry.getValue())) {             return entry.getKey();         }     }     return null; } 

In Java 8:

public static <T, E> Set<T> getKeysByValue(Map<T, E> map, E value) {     return map.entrySet()               .stream()               .filter(entry -> Objects.equals(entry.getValue(), value))               .map(Map.Entry::getKey)               .collect(Collectors.toSet()); } 

Also, for Guava users, BiMap may be useful. For example:

BiMap<Token, Character> tokenToChar =      ImmutableBiMap.of(Token.LEFT_BRACKET, '[', Token.LEFT_PARENTHESIS, '('); Token token = tokenToChar.inverse().get('('); Character c = tokenToChar.get(token); 
like image 60
Vitalii Fedorenko Avatar answered Oct 07 '22 18:10

Vitalii Fedorenko


If you choose to use the Commons Collections library instead of the standard Java Collections framework, you can achieve this with ease.

The BidiMap interface in the Collections library is a bi-directional map, allowing you to map a key to a value (like normal maps), and also to map a value to a key, thus allowing you to perform lookups in both directions. Obtaining a key for a value is supported by the getKey() method.

There is a caveat though, bidi maps cannot have multiple values mapped to keys, and hence unless your data set has 1:1 mappings between keys and values, you cannot use bidi maps.


If you want to rely on the Java Collections API, you will have to ensure the 1:1 relationship between keys and values at the time of inserting the value into the map. This is easier said than done.

Once you can ensure that, use the entrySet() method to obtain the set of entries (mappings) in the Map. Once you have obtained the set whose type is Map.Entry, iterate through the entries, comparing the stored value against the expected, and obtain the corresponding key.


Support for bidi maps with generics can be found in Google Guava and the refactored Commons-Collections libraries (the latter is not an Apache project). Thanks to Esko for pointing out the missing generic support in Apache Commons Collections. Using collections with generics makes more maintainable code.


Since version 4.0 the official Apache Commons Collections™ library supports generics.

See the summary page of the "org.apache.commons.collections4.bidimap" package for the list of available implementations of the BidiMap, OrderedBidiMap and SortedBidiMap interfaces that now support Java generics.

like image 43
Vineet Reynolds Avatar answered Oct 07 '22 18:10

Vineet Reynolds