Java映射,从值到键

| 有什么方法可以获取与映射中的已知值关联的键?通常,您知道键,并且想要获取值,但是我想做相反的事情,即从值到键。可能吗?     
已邀请:
是的,您必须遍历映射中的值,然后将每个键存储在列表中:
for (Map.Entry<K,V> entry : map.entrySet()) {
  V value = entry.getValue();
  if (value.equals(someTargetValue) {
      // add key (entry.getKey()) to list
  }
}
或者,您也可以使用双向地图,但请注意:   此映射强制执行以下限制:键和值之间存在1:1关系,这意味着多个键不能映射到同一值。     
好吧,我不是Google Project LambdaJ的专家,但是它确实提供了一些不错的选择。 假设您有一张全月的地图:
month.put(1,\"Monday\");
month.put(2,\"Tuesday\");
month.put(3,\"Wednesday\");
...
然后,我们可以轻松实现您想要的目标:
Set<Integer> result = with(month).retainValues(is(\"Friday\")).keySet();
甚至还有一些更有趣的搜索,例如:
Set<Integer> result = with(month).retainValues(anyOf(is(\"Monday\"),is(\"Friday\"))).keySet();
    
无需迭代所有键来寻找值,就可以使用Apache Commons BidiMap     
映射是一个数学条目,并不表示可以进行反向映射。也就是说,如果每个映射的值都是唯一的,则您可能可以创建“反向”映射。自然,您必须将所有数据操作封装在适当更新两个Maps的方法中。
Map<Key, Value> normal;
Map<Value, Key> reverse;
如果每个映射值都不都是唯一的,则需要创建一个值到键列表的反向映射。
Map<Key, Value> normal;
Map<Value, List<Key>> reverse;
最后,如果您不关心快速访问,则可以遍历整个Map寻找值。由于您将同时需要Value和Key,因此最好对Map.Entry项进行迭代。
Value searchingFor = ...;
Map<Key, Value> normal;
List<Key> keys = new ArrayList<Key>();
for (Map.Entry<Key, Value> entry : normal.entrySet()) {
   if (entry.getValue().equals(searchingFor)) {
     keys.add(entry.getKey());
   }
}
您选择使用的技术将在很大程度上取决于是否要以更快的速度来换取内存占用量。通常,由于对值进行哈希处理,因此拥有额外的Map会更快,但会占用额外的内存。在Map.Entry上循环比较慢,但占用的内存更少。     
在这里,他们已经谈论过双向地图。如今,番石榴(https://github.com/google/guava)提供了一个不错的BiMap,您可以将其用于此目的: https://github.com/google/guava/wiki/NewCollectionTypesExplained#bimap     

要回复问题请先登录注册