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();
}
}
}
答
我会做这样的事情:
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());
请注意以下事项:
- 很明显,可能有多个具有相同值的键。
- forEach *方法是遍历Trove集合的最有效方法。
- 如果对象分配对您而言是性能问题,则可以重复使用这些过程。
- 如果“-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
您可能会感兴趣的番石榴的'BiMap' – leventov 2014-09-30 14:05:53