当键是只有第一个元素已知的元组时,如何获取 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])]
.
假设我有一个不可变的 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])]
.