2014-09-30 58 views
0

如何從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

回答

1

我會做這樣的事情:

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來指示是否找到該值。
0

您可以嘗試以這種方式

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