下面是我的代码......
Map<Integer, String> MyType = sessionInfo.getType();
//{2=somename}
我试图从价值中获取密钥......而不运行任何循环......是否可能?
MyType.get("somename") // should output 2`
答案 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)
如果您选择使用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();