1

我有一个哈希图。多个键具有相同的值。什么是最好的方法来找到

keys for repeated Values无需迭代。?

阅读这个文档感觉它没有任何功能。

注意:键 | 值对是 Int 类型

4

5 回答 5

0

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

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

于 2013-03-06T14:00:15.510 回答
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;
}

ideone 上的演示

于 2013-03-06T14:03:55.043 回答
0

这真的不可能。containsValue()超类中 method 的实现java.util.AbstractMap会遍历这些值。

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

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

于 2013-03-06T14:06:37.663 回答
0

如果您从无法控制的代码中读取该地图,那么您别无选择,只能在地图上进行迭代。

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

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

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

关于地图的Java 教程包括一个关于使用地图实现多地图的部分。

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

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

于 2013-03-06T14:13:46.280 回答
0

尝试改变

File newxmlfile = new File(Environment.getExternalStorageDirectory()
+ ts);
to
File newxmlfile = new File(Environment.getExternalStorageDirectory()
+ "/"+ts);
于 2013-03-06T15:14:20.390 回答