TIntObjectHashMap - 获取给定值的密钥

问题描述:

如何从Trove TIntObjectHashMap中获取一个存在且已在地图中找到的值?TIntObjectHashMap - 获取给定值的密钥

if(map.containsValue(source)) { 
     for (Entry<Integer, String> entry : map.entrySet()) { // entrySet() is not recognized by Trove? and i can not find any corresponding method ?? 
      if (entry.getValue().equals(source)) { 
       entry.getKey(); 
     } 
    } 
} 
+0

您可能会感兴趣的番石榴的'BiMap' – leventov 2014-09-30 14:05:53

我会做这样的事情:

TIntObjectMap<String> map = new TIntObjectHashMap<>(); 
map.put(1, "a"); 
map.put(2, "b"); 

AtomicInteger found = new AtomicInteger(-1); 
map.forEachEntry(new TIntObjectProcedure<String>() { 
    @Override 
    public boolean execute(int key, String value) { 
     if (value.equals("a")) { 
      found.set(key); 
      return false; 
     } 
     return true; 
    } 
}); 
System.out.println("Found: " + found.get()); 

请注意以下事项:

  1. 很明显,可能有多个具有相同值的键。
  2. forEach *方法是遍历Trove集合的最有效方法。
  3. 如果对象分配对您而言是性能问题,则可以重复使用这些过程。
  4. 如果“-1”(或其他)是地图的有效键,则可以使用另一个AtomicBoolean来指示是否找到该值。

您可以尝试以这种方式

TIntObjectHashMap<String> map = new TIntObjectHashMap<>(); 
map.put(1, "a"); 
map.put(2, "b"); 
//convert TIntObjectHashMap to java.util.Map<Integer,String> 
Map<Integer, String> utilMap = new HashMap<>(); 
for (int i : map.keys()) { 
    utilMap.put(i, map.get(i)); 
} 
Integer key=null; 
if (map.containsValue("a")) { 
    for (Map.Entry<Integer, String> entry : utilMap.entrySet()) { // issue solved 
     if (entry.getValue().equals("a")) { 
      key=entry.getKey(); 
      } 
     } 
} 
System.out.println(key); 

输出地说:

1 
+0

虽然这会工作,有轻微的含义:由于每特罗韦“上宝库地图使用Map.entrySet是支持的,但不鼓励的原因是,这个API需要创建Trove所有其他部分能够避免的Map.Entry对象。“你知道任何可以使用Trove原生方法的替代方法吗? – 2014-09-30 12:10:32

+0

@MaciejCygan no。我不知道'Trove'的方式 – 2014-09-30 12:12:23