Java 返回哈希映射中公共值的键

Java 返回哈希映射中公共值的键,java,Java,我有一个散列图。多个键具有相同的值。找到目标的最佳方法是什么 重复值的键无需迭代 阅读文档时,它感觉没有任何功能 注意:键|值对是Int类型的如果不在标准JDK API中的映射上迭代,就无法找到值的所有键 您可以通过以下方式使用Guava库: 使用返回其值满足谓词的项的 转换为番石榴多重贴图并使用 使用 不管怎样,最终都会迭代集合。在某些库中,迭代可能被隐藏在视图之外,但它必然存在 您可以很容易地编写一个简单的方法来满足您的需要: public static <K,V> Set&l

我有一个散列图。多个键具有相同的值。找到目标的最佳方法是什么

重复值的键
无需迭代

阅读文档时,它感觉没有任何功能


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

如果不在标准JDK API中的映射上迭代,就无法找到值的所有键

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

  • 使用返回其值满足谓词的项的
  • 转换为番石榴多重贴图并使用
  • 使用

不管怎样,最终都会迭代集合。在某些库中,迭代可能被隐藏在视图之外,但它必然存在

您可以很容易地编写一个简单的方法来满足您的需要:

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;
}
public静态设置keysOfDupValues(映射m){
Set res=新的HashSet();
Map seen=新的HashMap();
对于(Map.Entry e:m.entrySet()){
V=e.getValue();
K=e.getKey();
如果(见附件五){
决议增补(k);
res.add(seen.get(v));
}否则{
看见。把(v,k);
}
}
返回res;
}

这真的不可能。方法
在超类
java.util.AbstractMap
中的具体实现包含value()

因此,您必须通过这些值来实现这一点


您可以查看以获得有关如何执行此操作的提示。

如果您从无法控制的代码中读取映射,则除了在映射上迭代之外别无选择

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

每次您需要在原始地图中包含一对新的
,您也可以在反向地图中包含反向对
。如果
v
作为键(即原始值)在反向映射中尚不存在,则将其映射到仅包含
k
作为值(即原始键)的列表。如果键
v
已存在于反向映射中,则只需将值
k
推送到现有列表中即可

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

包含一节介绍如何使用映射实现多重映射

如果您可以控制地图创建过程,此解决方案应该非常有效。然而,如果地图是由一些外部机制创建和定期更新的,那么它将没有什么好处

如果您只能控制映射的创建,而不能控制映射的更新,则可以实现一个新类,公开
map
接口,该接口在内部也保存反向映射,并在插入/删除新映射对时对其进行更新,或者支持一种通知机制,让您的代码知道映射已更改以及如何更改。

尝试更改

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

没有迭代?隐马尔可夫模型。。我推荐一个水晶球。请看这里@PSR我已经完成了这个问题,但是我仍然没有找到一个函数来返回我需要的东西。这可能是一个愚蠢的问题,但是为什么你不想迭代呢?迭代是好的,你知道,它不是脏的。@CyrilleKarmann迭代不是脏的,但如果有更聪明的方法的话。仍然想知道,我有多个相同的多个键的值。但我想我可以调整一下。