哈希表根据值获取键(反转哈希表)
昨天下午,有人在扣扣群里问哈希表怎么根据键获取值,我就顺便问了句,怎么根据值获取键呢?结果没人回答我,我知道去帮助文档里自己找了。 
首先我找到java.util.HashMap<K, V>类,在里面我找到了这么一个方法: 
entrySet() 返回此映射所包含的映射关系的 Set 视图。返回的类型是Set<Map.Entry<K, V>>。
其实toString()也能同时获取哈希表的所有键和值,但是返回的类型是String,想要单独获取一个键和一个值就有点麻烦了。
我再点进了Map.Entry<K, V>类,可以看到,有getKey()和getValue()两个方法,这样就能单独的取出每个键和值了。 
getKey() 返回与此项对应的键。返回类型为K。
getValue() 返回与此项对应的值。返回类型为V。
那么怎么从set视图中获取每一个Map.Entry<K, V>呢?我再查看了Set类,找到了这个方法:
iterator() 返回在此 set 中的元素上进行迭代的迭代器。返回类型为Iterator<E>。
Iterator<E>类中有这么两个方法,那么我们可以通过循环来从迭代器获取Map.Entry<K, V>。 
hasNext() 如果仍有元素可以迭代,则返回 true。返回类型为boolean。
next() 返回迭代的下一个元素。返回类型为E。
这样,我们就可以单独得到每一个键和值了。之后,为了能让键和值重新对应起来,我们可以再把它们重新放进一个新的哈希表,不过我们把键和值反过来,这样,我们就可以从新的哈希表中,根据原本的哈希表的值来获取键了。
public class HashMapTool {public HashMap<?, ?> reverse(HashMap<?, ?> originalMap) {HashMap<Object, Object> reverseMap = new HashMap<Object, Object>();Set<?> set = originalMap.entrySet();Iterator<?> it = set.iterator();while (it.hasNext()) {Map.Entry<?, ?> entry = (Map.Entry<?, ?>) it.next();reverseMap.put(entry.getValue(), entry.getKey());}return reverseMap;}}?
我们来测试一下: 
OK!这样就能通过值获取键了~~
?