当键是只有第一个元素已知的元组时,如何获取 scala Map 值?

How to get a scala Map value, when the key is a tuple in which only the first element is known?

假设我有一个不可变的 scala Map[(String, Boolean), Set[String]],例如:

val myMap = Map(("a",true) -> Set("b","c"))

现在假设我只知道键元组的第一个元素,"a"。如果:

,我可以(如果可以的话如何)获取此键的地图值

1) 我 知道 键可以是 ("a", true)("a", false) (不能有两个键与第一个元素具有相同的字符串)

2) 我不知道,在这种情况下,我希望对可能的两个值进行某种串联,例如 v1.union(v2)v1 ++ v2,等等

有没有我可以使用的 scala "magic",比如 myMap.get(("a", Any))

一般来说,散列映射不是那样工作的,至少效率不高——您仍然可以线性扫描映射并选择第一个匹配条件的键。在您的特定情况下,您可以简单地尝试查找记录两次 - 首先使用 (key, true),然后如果没有找到 (key, false)

myMap.collect {
  case (("a",b), s) => s
}.toSet.flatten

已更新(查看评论):

如果myMap比较大你可以试试:

Set(myMap.get("a", true), myMap.get("a", false)).flatten.flatten

如果您有很多这样的查询,最好将地图替换为 Map[String, Map[Boolean, Set[String]]。应该很容易看出它们是等价的:当你有例如("a", false) -> Set()("a", true) -> Set("a") 在您的原始地图中,您将在新地图中有 "a" -> Map(false -> Set(), true -> Set("a"))

但是,它的内存效率可能较低,尤其是对于这些键类型。您可以通过将 Map[Boolean, Set[String]] 替换为 (Option[Set[String]], Option[Set[String]]) 来改进 this,其中第一个字段对应于 false,第二个字段对应于 true

案例

1) I know that the key could either be ("a", true) or ("a", false) (there cannot be two keys with the same String as the first element)

只需使用 Map[String, (Boolean, Set[String])].