2013-03-06 48 views
1

我有一个散列映射。多个键具有相同的值。什么是最好的方式找到没有迭代的散列映射中常见值的返回键

keys for repeated Values。 ?

阅读this文档它感觉没有它的功能。

注意:关键词|值对是Int类型的

+3

不反复?嗯..我会推荐一个水晶球。 – jrajav 2013-03-06 13:56:27

+0

在这里看到http://stackoverflow.com/questions/1383797/java-hashmap-how-to-get-key-from-value – PSR 2013-03-06 13:59:06

+0

@PSR我做过的问题,但我仍然没有找到一个函数回报我需要的东西。 – 2013-03-06 14:00:30

回答

0

不管怎样,您最终都会迭代该集合。迭代可能在某些库中被隐藏,但它肯定会在那里。

您可以轻松地编写一个简单的方法,做你所需要的:

public static <K,V> Set<K> keysOfDupValues(Map<K,V> m) { 
    Set<K> res = new HashSet<K>(); 
    Map<V,K> seen = new HashMap<V,K>(); 
    for (Map.Entry<K,V> e : m.entrySet()) { 
     V v = e.getValue(); 
     K k = e.getKey(); 
     if (seen.containsKey(v)) { 
      res.add(k); 
      res.add(seen.get(v)); 
     } else { 
      seen.put(v, k); 
     } 
    } 
    return res; 
} 

Demo on ideone

+0

仍然想知道,我有多个值相同的多个键。但我想我可以调整这一点。 – 2013-03-06 14:15:29

0

没有办法在没有在标准JDK API中迭代Map的情况下找到值的所有键。

可以使用番石榴库,或者通过:

0

真的不可能。在超类java.util.AbstractMap中方法containsValue()的执行非常重复遍历这些值。

所以,你必须通过价值观来实现这一点。

您可以查看implementation of containsValue()以了解如何做到这一点。

0

如果您从代码中获得的地图读取无法控制,那么除了在地图上迭代外,您别无选择。

在任何情况下,您都可以通过构建反向映射来避免多次迭代的问题,该映射会归结为multimap,但由于在Java中没有针对该模式的特定类定义,因此必须构建它使用地图和列表。

您每次需要在原始地图中包含一对新对<k,v>时,还需要在您的反向地图中包含反向对<v,k>。如果v作为关键字(即原始值)尚未存在于反向映射中,则将其映射到仅包含k作为值(即原始关键字)的列表。如果密钥v已经存在于反向映射中,那么只需将值k推送到现有列表。

当您需要知道哪些键映射到原始映射中的给定值时,您可以查询反向映射中的值并获取键列表。

Java tutorial on maps包括使用地图实现多图的一节。

如果您能控制地图创建过程,此解决方案应该非常有效。但是,如果地图是由某种外部机制创建并定期更新的,那么收益会很小。

如果您只能控制地图的创建,但不能更新地图,您可以实现一个新类,公开Map接口,该接口在内部保存反向地图,并在插入/移除新对时对其进行更新,或者支持通知机制让你的代码知道地图已经改变了,以及如何改变。

0

尝试改变

File newxmlfile = new File(Environment.getExternalStorageDirectory() 
+ ts); 
to 
File newxmlfile = new File(Environment.getExternalStorageDirectory() 
+ "/"+ts);