返回哈希映射中常见值的键

时间:2013-03-06 13:54:41

标签: java

我有一个哈希映射。多个键具有相同的值。找到

的最佳方法是什么

keys for repeated Values没有迭代。 ?

阅读this文档,认为它没有任何功能。

注意:键|值对是Int类型

5 个答案:

答案 0 :(得分:0)

如果没有在标准JDK API中迭代Map,就无法找到值的所有键。

您可以通过以下方式使用Guava库:

答案 1 :(得分: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

答案 2 :(得分:0)

这真的不可能。超类containsValue()中方法java.util.AbstractMap的实现迭代了值。

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

您可以查看implementation of containsValue()以了解如何执行此操作。

答案 3 :(得分:0)

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

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

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

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

Java tutorial on maps包含有关使用地图实施多地图的部分。

如果您可以控制地图创建过程,此解决方案应该非常有效。但是,如果地图是由一些外部机制创建并定期更新的,那么它将获得很少的收益。

如果你只能控制地图的创建,而不是它的更新,你可以实现一个暴露Map接口的新类,它在内部保存反向地图,并在新的一对时更新它。插入/删除,或支持通知机制,让您的代码知道地图已被更改以及如何更改。

答案 4 :(得分:0)

尝试更改

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