2016-03-03 199 views
-1

下面是我的代码拿到钥匙...的Java地图从价值

Map<Integer, String> MyType = sessionInfo.getType(); 
//{2=somename} 

我想从价值的关键......不运行任何环路....这可能吗?

MyType.get("somename") // should output 2` 
+4

在map中,不可能直接获取给定值的密钥。 – Rahul

+2

如果多个键的值相同,你期望什么? – vins

+0

在我的情况下..值不能相同.. –

回答

3

这并不容易摆脱价值关键在哈希表或HashMap中,相比以获得密钥的价值,因为哈希映射或哈希表不强制执行Java中的Map内的键和值之间的一对一映射。 Infact Map允许将相同的值映射到HashMap,Hashtable或任何其他Map实现中的多个键。

 String key= null; 
     String value="somename"; 
     for(Map.Entry entry: MyType.entrySet()){ 
      if(value.equals(entry.getValue())){ 
       key = entry.getKey(); 
       break; //breaking because its one to one map 
      } 
     } 
1

我会鼓励为了简单而运行循环。它很可能不会减慢你的程序一个明显的数量。但是,如果您不能运行循环,Google的番石榴图书馆会有一个名为BiMap的BiDirectional Map Collection,它可以是(found here)。地图可以双向运行,并且保证随时都可以同步。我也假设你在地图上有独特的价值。如果你不这样做,重复的值将没有特定的关键链接。

BiMap<String, Integer> biMapInversed = biMap.inverse(); // how to get inverted map 

再说一遍,除非绝对必要,否则我不会鼓励。循环播放在大多数情况下都可以很好地工作。

0

这是不可能的。您需要考虑可能在地图中复制的值。 例如,你如何处理{2 = somename}和{5 = somename}

你仍然需要使用for循环来检查值和获取键,并决定打破或继续进行值匹配。

0

如果您确定自己的值是唯一的,则可以遍历旧映射的条目。

Map<String, Character> myNewHashMap = new HashMap<>(); 
for(Map.Entry<Character, String> entry : myHashMap.entrySet()){ 
    myNewHashMap.put(entry.getValue(), entry.getKey()); 
} 

或者,你可以使用一个双向的地图状番石榴提供和使用逆()方法:

BiMap<Character, String> myBiMap = HashBiMap.create(); 
myBiMap.put('a', "test one"); 
myBiMap.put('b', "test two"); 

BiMap<String, Character> myBiMapInversed = myBiMap.inverse(); 
1

this SO answer

两者如果您选择使用的 的Commons Collections library而不是标准的Java集合API,您可以轻松实现这一目标。

在类别库BidiMap接口是 双向地图,允许你映射一键的值(像正常 映射),并且还以映射的值的键,从而使用户可以执行 在两个方向上查找。通过getKey() method支持获得值的密钥 。

有一个警告,虽然,比迪地图不能有映射到 多重键的值,因此除非你的数据集有1:键 和价值观,你不能使用bidimaps之间1映射。