这里有一些问题如何获得与给定值相关联的Map
个密钥,答案指向谷歌集合(用于双向映射)或基本上说“循环它”。
我刚刚注意到Map接口有一个boolean containsValue(Object value)
方法,“对于Map
接口的大多数实现,可能需要在地图大小上线性的时间”以及{{1}中的实现确实迭代AbstractMap
。
设计决定在entrySet()
中包含containsValue
但是没有Map
的原因可能是什么?我可以看出为什么人们会省略这两者,或者包括两者,但是如果有的话,为什么不省略?
我想到的一件事是,它需要任何Map实现来了解返回值的Collection实现,但这实际上并不是一个好理由,因为Collection<V> getKeysForValue(Object)
方法也返回一个集合(在Collection<V> values()
)的情况下匿名new AbstractCollection<V>()
。
答案 0 :(得分:3)
有些集合支持这一点,但它们通常涉及主题化反向查找映射,这比相对简单的一对一映射更昂贵。因此,支持这一点可能会使所有地图的更新成本增加两倍。
另一个问题是概括。密钥必须实现hashCode和equals(对于Hash映射)或可比较(对于Sorted Maps)值不必实现任何使得构造广义反向查找不可能的任何东西,或者它对不太可能需要的值提出额外要求
答案 1 :(得分:2)
自1.2以来,地图可以返回Collection
个键和值,因此查找值非常简单:public Object containsValue(Object v) {return values().contains(v);}
此方法使用来自values()
和{{1}的原生优化对于contains()
的任何实现,但在大多数情况下可能都很慢......
您正在寻找的Map
并非无足轻重。它需要一个特定的算法,并且该算法不能足够通用,必须针对getKeysForValue(Object)
的每个实现进行优化。
这可能是原因,或者仅仅是Collection API充满了这种小漏洞......