Scala地图中有没有找到?

时间:2017-06-09 11:00:28

标签: scala find

在Scala地图中,如何获取Map中具有相同值的所有键?

例如,在我的Map中,我有3个键,其值为27

例如:

large -> 27
indispensable -> 27
most -> 27 

我试过

val adj1value = htAdjId.find(_._2 == value1).getOrElse(default)._1

但这只给了我第一个键“大”(就像查找的definition一样)。我搜索了很多,但我找不到“findall”功能。它是否存在于Scala中?如果没有,有人可以请教我如何解决这个问题吗?

3 个答案:

答案 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:一个在常规方向,一个反转(值变为键,键变为值)或者一起使用不同的数据结构。

如果地图很大,或者你要经常进行这种检查,那么两张地图是个好主意。否则请尝试过滤而不是查找