繁体   English   中英

Scala地图中有没有找到?

[英]Is there a findall in Scala maps?

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

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

例如:

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

我试过了

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

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

您可以使用keys过滤集合并提取所有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)]就足够了,并且可以节省因使用a而产生的开销。 Map

您可以将地图视为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"))

[我的朋友离线回答] Hashmaps通常是为了有效地进行正向查找而构建的。 除非您知道hashmap中使用的基础数据结构支持此功能,否则您可能不希望执行此“反向查找”,因为它的效率非常低。

如果要在两个方向上访问数据,请考虑从一开始就将数据放入双向地图或“双向地图”。 或者,使用两个哈希图 :一个在常规方向上,一个反转(值变为键,键变为值)或者一起使用不同的数据结构。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM