Java映射,从值到键

Java映射,从值到键,java,maps,Java,Maps,有没有办法获取与地图中的已知值关联的键?通常你知道键,你想得到值,但我想做相反的事情,从一个值到另一个键。可能吗 是的,您必须迭代映射中的值,然后将每个键存储在列表中: for (Map.Entry<K,V> entry : map.entrySet()) { V value = entry.getValue(); if (value.equals(someTargetValue) { // add key (entry.getKey()) to list }

有没有办法获取与地图中的已知值关联的键?通常你知道键,你想得到值,但我想做相反的事情,从一个值到另一个键。可能吗

是的,您必须迭代映射中的值,然后将每个键存储在列表中:

for (Map.Entry<K,V> entry : map.entrySet()) {
  V value = entry.getValue();
  if (value.equals(someTargetValue) {
      // add key (entry.getKey()) to list
  }
}
for(Map.Entry:Map.entrySet()){
V value=entry.getValue();
if(value.equals)(someTargetValue){
//将键(entry.getKey())添加到列表
}
}
或者,您可以使用一个,尽管是这样的注意事项:

此映射强制执行键和值之间存在1:1关系的限制,这意味着多个键不能映射到同一个值


无需迭代所有键来查找值,您就可以使用一个

映射是一个数学条目,并不意味着可以进行反向映射。也就是说,您可以创建一个“反向”映射,如果每个映射值都是唯一的。当然,您必须将所有数据操作封装在适当更新两个映射的方法中

Map<Key, Value> normal;
Map<Value, Key> reverse;
映射法线;
地图反转;
如果每个映射值都不是唯一的,则需要创建值到键列表的反向映射

Map<Key, Value> normal;
Map<Value, List<Key>> reverse;
映射法线;
地图反转;
最后,如果您不关心快速访问,您可以在整个映射上迭代寻找值。因为您需要值和键,所以最好在Map.Entry项上迭代

Value searchingFor = ...;
Map<Key, Value> normal;
List<Key> keys = new ArrayList<Key>();
for (Map.Entry<Key, Value> entry : normal.entrySet()) {
   if (entry.getValue().equals(searchingFor)) {
     keys.add(entry.getKey());
   }
}
Value search for=。。。;
映射法线;
列表键=新的ArrayList();
对于(Map.Entry:normal.entrySet()){
if(entry.getValue().equals(searchingFor)){
key.add(entry.getKey());
}
}

您选择使用的技术在很大程度上取决于以速度换取内存占用是否更好。通常,由于对值进行哈希运算,因此拥有额外的映射速度更快,但需要额外的内存。在映射上拥有一个循环。条目速度较慢,但占用内存较少。

嗯,我不是这方面的专家,但它确实提供了一些很酷的选择

假设您有一张一个月中所有日期的地图:

month.put(1,"Monday");
month.put(2,"Tuesday");
month.put(3,"Wednesday");
...
这样我们就可以很容易地实现您想要的:

Set<Integer> result = with(month).retainValues(is("Friday")).keySet();
Set result=with(月).retainValues(is(“星期五”).keySet();
甚至还有一些更有趣的搜索,如:

Set<Integer> result = with(month).retainValues(anyOf(is("Monday"),is("Friday"))).keySet();
Set result=with(month).retainValues(任意一个(is(“星期一”)、is(“星期五”)).keySet();

这里他们已经谈到了双向地图。现在,Guava()提供了一个很好的双向地图,您可以使用它:


让价值成为关键。是的,这是Captian显而易见的说法,但这确实是除了在地图上进行线性搜索之外的唯一方法——就像拉里·沃尔所说的那样,这就像试图用一个装载的Uzi将某人击死一样。可能的重复和双向地图应该是可行的。如果你不想使用额外的库,只需使用两个有价值的地图即可e键反转,这就是双向映射的实现方式。您描述的双向映射仅适用于数学恒等式。如果有两个值指向同一对象,则“反转”方向必须有两个键,因此不是数学地图。也许这是一个很好的点,但如果数据集有重复的值,则会产生很大的差异。@Edwin说得对,并在网页上的描述中指出:“此映射强制执行键和值之间存在1:1关系的限制,这意味着多个键不能映射到同一个值。”这也是为什么我将两者都作为潜在解决方案提供的原因。我也将在回答中提出警告。