在Scala地图中,如何获取Map中具有相同值的所有键?
例如,在我的Map中,我有3个键,其值为27
例如:
large -> 27
indispensable -> 27
most -> 27
我试过
val adj1value = htAdjId.find(_._2 == value1).getOrElse(default)._1
但这只给了我第一个键“大”(就像查找的definition一样)。我搜索了很多,但我找不到“findall”功能。它是否存在于Scala中?如果没有,有人可以请教我如何解决这个问题吗?
答案 0 :(得分:0)
您可以使用keys
过滤集合并提取所有密钥:
val map = Map("h" -> 27, "b" -> 2, "c" -> 27)
map.filter { case (key, value) => value == 27 }.keys
产量
res0: Iterable[String] = Set(h, c)
虽然我认为如果你需要每次迭代整个Map
,也许它不是正确的数据结构,也许List[(String, Int)]
就足够了,节省了开销使用Map
生成的。
答案 1 :(得分:0)
你可以将地图视为Iterable [K,V]然后groupBy这样的值..
@ Map(
"large" -> 27,
"indispensable" -> 27,
"most" -> 27
).groupBy(_._2).mapValues(_.keys)
res4: Map[Int, Iterable[String]] = Map(27 -> Set(
"large",
"indispensable",
"most"))
答案 2 :(得分:0)
[我的朋友离线回答] Hashmaps通常是为了有效地进行正向查找而构建的。除非您知道hashmap中使用的基础数据结构支持这一点,否则您可能不希望这样做"反向查找"因为它非常效率不高。
考虑将您的数据放入bi-directional map或" bi-map"如果您要在两个方向上访问它,从一开始。或者,使用two hashmaps:一个在常规方向,一个反转(值变为键,键变为值)或者一起使用不同的数据结构。
如果地图很大,或者你要经常进行这种检查,那么两张地图是个好主意。否则请尝试过滤而不是查找