Java Map从值获取密钥

时间:2016-03-03 04:21:12

标签: java hashmap

下面是我的代码......

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

我试图从价值中获取密钥......而不运行任何循环......是否可能?

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

5 个答案:

答案 0 :(得分:5)

与从key中获取值相比,从Hashtable或HashMap中的值获取键并不容易,因为Hash Map或Hashtable并不强制执行Map中键和值之间的一对一映射Java的。 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 :(得分:1)

为了简单起见,我鼓励运行循环。它很可能不会使你的程序减慢显着的速度。

但是,如果你不能运行循环,谷歌的Guava库有一个名为BiMap的双向地图集,可以是(found here)。地图可以双向工作,并保证始终保持同步。我也假设你的地图中有唯一的值。如果不这样做,重复的值将没有要链接的特定键。

try
{
    switch (findBy.ToLower())
    {
        case "classname":
            webElement = driver.FindElement(By.ClassName(findByValue));
            break;
        case "cssselector":
            webElement = driver.FindElement(By.CssSelector(findByValue));
            break;
        case "id":
            webElement = driver.FindElement(By.Id(findByValue));
            break;
        case "linktext":
            webElement = driver.FindElement(By.LinkText(findByValue));
            break;
        case "name":
            webElement = driver.FindElement(By.Name(findByValue));
            break;
        case "partiallinktext":
            webElement = driver.FindElement(By.PartialLinkText(findByValue));
            break;
        case "tagname":
            webElement = driver.FindElement(By.TagName(findByValue));
            break;
        case "xpath":
            webElement = driver.FindElement(By.XPath(findByValue));
            break;
    }
}
catch (Exception e)
{
    return null;
}

同样,除非绝对必要,否则我不会鼓励这样做。在大多数情况下,循环通过将完美无缺。

答案 2 :(得分:1)

取自this SO answer

  

如果您选择使用Commons Collections library代替   标准的Java Collections API,您可以轻松实现这一目标。

     

Collections库中的BidiMap接口是a   双向映射,允许您将键映射到值(如正常值)   映射),并将值映射到键,从而允许您执行   在两个方向上查找。支持获取值的键   由getKey() method

     

但有一点需要注意,比迪烟图不能映射多个值   到密钥,因此除非您的数据集在密钥之间具有1:1的映射   和值,你不能使用bidimaps。

答案 3 :(得分:0)

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

您仍然需要使用for循环来检查值并获取密钥并决定在匹配值时中断或继续。

答案 4 :(得分:0)

如果您确定自己的值是唯一的,则可以迭代旧地图的条目。

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

或者,您可以像Guava一样使用Bi-Directional地图并使用inverse()方法:

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

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